| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460 | 
							- /* dlaexc.f -- translated by f2c (version 20061008).
 
-    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 "f2c.h"
 
- #include "blaswrap.h"
 
- /* Table of constant values */
 
- static integer c__1 = 1;
 
- static integer c__4 = 4;
 
- static logical c_false = FALSE_;
 
- static integer c_n1 = -1;
 
- static integer c__2 = 2;
 
- static integer c__3 = 3;
 
- /* Subroutine */ int _starpu_dlaexc_(logical *wantq, integer *n, doublereal *t, 
 
- 	integer *ldt, doublereal *q, integer *ldq, integer *j1, integer *n1, 
 
- 	integer *n2, doublereal *work, integer *info)
 
- {
 
-     /* System generated locals */
 
-     integer q_dim1, q_offset, t_dim1, t_offset, i__1;
 
-     doublereal d__1, d__2, d__3;
 
-     /* Local variables */
 
-     doublereal d__[16]	/* was [4][4] */;
 
-     integer k;
 
-     doublereal u[3], x[4]	/* was [2][2] */;
 
-     integer j2, j3, j4;
 
-     doublereal u1[3], u2[3];
 
-     integer nd;
 
-     doublereal cs, t11, t22, t33, sn, wi1, wi2, wr1, wr2, eps, tau, tau1, 
 
- 	    tau2;
 
-     integer ierr;
 
-     doublereal temp;
 
-     extern /* Subroutine */ int _starpu_drot_(integer *, doublereal *, integer *, 
 
- 	    doublereal *, integer *, doublereal *, doublereal *);
 
-     doublereal scale, dnorm, xnorm;
 
-     extern /* Subroutine */ int _starpu_dlanv2_(doublereal *, doublereal *, 
 
- 	    doublereal *, doublereal *, doublereal *, doublereal *, 
 
- 	    doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlasy2_(
 
- 	    logical *, logical *, integer *, integer *, integer *, doublereal 
 
- 	    *, integer *, doublereal *, integer *, doublereal *, integer *, 
 
- 	    doublereal *, doublereal *, integer *, doublereal *, integer *);
 
-     extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *, 
 
- 	    integer *, doublereal *, integer *, doublereal *);
 
-     extern /* Subroutine */ int _starpu_dlarfg_(integer *, doublereal *, doublereal *, 
 
- 	     integer *, doublereal *), _starpu_dlacpy_(char *, integer *, integer *, 
 
- 	    doublereal *, integer *, doublereal *, integer *), 
 
- 	    _starpu_dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, 
 
- 	    doublereal *), _starpu_dlarfx_(char *, integer *, integer *, doublereal *, 
 
- 	     doublereal *, doublereal *, integer *, doublereal *);
 
-     doublereal thresh, smlnum;
 
- /*  -- LAPACK auxiliary routine (version 3.2) -- */
 
- /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
 
- /*     November 2006 */
 
- /*     .. Scalar Arguments .. */
 
- /*     .. */
 
- /*     .. Array Arguments .. */
 
- /*     .. */
 
- /*  Purpose */
 
- /*  ======= */
 
- /*  DLAEXC swaps adjacent diagonal blocks T11 and T22 of order 1 or 2 in */
 
- /*  an upper quasi-triangular matrix T by an orthogonal similarity */
 
- /*  transformation. */
 
- /*  T must be in Schur canonical form, that is, block upper triangular */
 
- /*  with 1-by-1 and 2-by-2 diagonal blocks; each 2-by-2 diagonal block */
 
- /*  has its diagonal elemnts equal and its off-diagonal elements of */
 
- /*  opposite sign. */
 
- /*  Arguments */
 
- /*  ========= */
 
- /*  WANTQ   (input) LOGICAL */
 
- /*          = .TRUE. : accumulate the transformation in the matrix Q; */
 
- /*          = .FALSE.: do not accumulate the transformation. */
 
- /*  N       (input) INTEGER */
 
- /*          The order of the matrix T. N >= 0. */
 
- /*  T       (input/output) DOUBLE PRECISION array, dimension (LDT,N) */
 
- /*          On entry, the upper quasi-triangular matrix T, in Schur */
 
- /*          canonical form. */
 
- /*          On exit, the updated matrix T, again in Schur canonical form. */
 
- /*  LDT     (input)  INTEGER */
 
- /*          The leading dimension of the array T. LDT >= max(1,N). */
 
- /*  Q       (input/output) DOUBLE PRECISION array, dimension (LDQ,N) */
 
- /*          On entry, if WANTQ is .TRUE., the orthogonal matrix Q. */
 
- /*          On exit, if WANTQ is .TRUE., the updated matrix Q. */
 
- /*          If WANTQ is .FALSE., Q is not referenced. */
 
- /*  LDQ     (input) INTEGER */
 
- /*          The leading dimension of the array Q. */
 
- /*          LDQ >= 1; and if WANTQ is .TRUE., LDQ >= N. */
 
- /*  J1      (input) INTEGER */
 
- /*          The index of the first row of the first block T11. */
 
- /*  N1      (input) INTEGER */
 
- /*          The order of the first block T11. N1 = 0, 1 or 2. */
 
- /*  N2      (input) INTEGER */
 
- /*          The order of the second block T22. N2 = 0, 1 or 2. */
 
- /*  WORK    (workspace) DOUBLE PRECISION array, dimension (N) */
 
- /*  INFO    (output) INTEGER */
 
- /*          = 0: successful exit */
 
- /*          = 1: the transformed matrix T would be too far from Schur */
 
- /*               form; the blocks are not swapped and T and Q are */
 
- /*               unchanged. */
 
- /*  ===================================================================== */
 
- /*     .. Parameters .. */
 
- /*     .. */
 
- /*     .. Local Scalars .. */
 
- /*     .. */
 
- /*     .. Local Arrays .. */
 
- /*     .. */
 
- /*     .. External Functions .. */
 
- /*     .. */
 
- /*     .. External Subroutines .. */
 
- /*     .. */
 
- /*     .. Intrinsic Functions .. */
 
- /*     .. */
 
- /*     .. Executable Statements .. */
 
-     /* Parameter adjustments */
 
-     t_dim1 = *ldt;
 
-     t_offset = 1 + t_dim1;
 
-     t -= t_offset;
 
-     q_dim1 = *ldq;
 
-     q_offset = 1 + q_dim1;
 
-     q -= q_offset;
 
-     --work;
 
-     /* Function Body */
 
-     *info = 0;
 
- /*     Quick return if possible */
 
-     if (*n == 0 || *n1 == 0 || *n2 == 0) {
 
- 	return 0;
 
-     }
 
-     if (*j1 + *n1 > *n) {
 
- 	return 0;
 
-     }
 
-     j2 = *j1 + 1;
 
-     j3 = *j1 + 2;
 
-     j4 = *j1 + 3;
 
-     if (*n1 == 1 && *n2 == 1) {
 
- /*        Swap two 1-by-1 blocks. */
 
- 	t11 = t[*j1 + *j1 * t_dim1];
 
- 	t22 = t[j2 + j2 * t_dim1];
 
- /*        Determine the transformation to perform the interchange. */
 
- 	d__1 = t22 - t11;
 
- 	_starpu_dlartg_(&t[*j1 + j2 * t_dim1], &d__1, &cs, &sn, &temp);
 
- /*        Apply transformation to the matrix T. */
 
- 	if (j3 <= *n) {
 
- 	    i__1 = *n - *j1 - 1;
 
- 	    _starpu_drot_(&i__1, &t[*j1 + j3 * t_dim1], ldt, &t[j2 + j3 * t_dim1], 
 
- 		    ldt, &cs, &sn);
 
- 	}
 
- 	i__1 = *j1 - 1;
 
- 	_starpu_drot_(&i__1, &t[*j1 * t_dim1 + 1], &c__1, &t[j2 * t_dim1 + 1], &c__1, 
 
- 		&cs, &sn);
 
- 	t[*j1 + *j1 * t_dim1] = t22;
 
- 	t[j2 + j2 * t_dim1] = t11;
 
- 	if (*wantq) {
 
- /*           Accumulate transformation in the matrix Q. */
 
- 	    _starpu_drot_(n, &q[*j1 * q_dim1 + 1], &c__1, &q[j2 * q_dim1 + 1], &c__1, 
 
- 		    &cs, &sn);
 
- 	}
 
-     } else {
 
- /*        Swapping involves at least one 2-by-2 block. */
 
- /*        Copy the diagonal block of order N1+N2 to the local array D */
 
- /*        and compute its norm. */
 
- 	nd = *n1 + *n2;
 
- 	_starpu_dlacpy_("Full", &nd, &nd, &t[*j1 + *j1 * t_dim1], ldt, d__, &c__4);
 
- 	dnorm = _starpu_dlange_("Max", &nd, &nd, d__, &c__4, &work[1]);
 
- /*        Compute machine-dependent threshold for test for accepting */
 
- /*        swap. */
 
- 	eps = _starpu_dlamch_("P");
 
- 	smlnum = _starpu_dlamch_("S") / eps;
 
- /* Computing MAX */
 
- 	d__1 = eps * 10. * dnorm;
 
- 	thresh = max(d__1,smlnum);
 
- /*        Solve T11*X - X*T22 = scale*T12 for X. */
 
- 	_starpu_dlasy2_(&c_false, &c_false, &c_n1, n1, n2, d__, &c__4, &d__[*n1 + 1 + 
 
- 		(*n1 + 1 << 2) - 5], &c__4, &d__[(*n1 + 1 << 2) - 4], &c__4, &
 
- 		scale, x, &c__2, &xnorm, &ierr);
 
- /*        Swap the adjacent diagonal blocks. */
 
- 	k = *n1 + *n1 + *n2 - 3;
 
- 	switch (k) {
 
- 	    case 1:  goto L10;
 
- 	    case 2:  goto L20;
 
- 	    case 3:  goto L30;
 
- 	}
 
- L10:
 
- /*        N1 = 1, N2 = 2: generate elementary reflector H so that: */
 
- /*        ( scale, X11, X12 ) H = ( 0, 0, * ) */
 
- 	u[0] = scale;
 
- 	u[1] = x[0];
 
- 	u[2] = x[2];
 
- 	_starpu_dlarfg_(&c__3, &u[2], u, &c__1, &tau);
 
- 	u[2] = 1.;
 
- 	t11 = t[*j1 + *j1 * t_dim1];
 
- /*        Perform swap provisionally on diagonal block in D. */
 
- 	_starpu_dlarfx_("L", &c__3, &c__3, u, &tau, d__, &c__4, &work[1]);
 
- 	_starpu_dlarfx_("R", &c__3, &c__3, u, &tau, d__, &c__4, &work[1]);
 
- /*        Test whether to reject swap. */
 
- /* Computing MAX */
 
- 	d__2 = abs(d__[2]), d__3 = abs(d__[6]), d__2 = max(d__2,d__3), d__3 = 
 
- 		(d__1 = d__[10] - t11, abs(d__1));
 
- 	if (max(d__2,d__3) > thresh) {
 
- 	    goto L50;
 
- 	}
 
- /*        Accept swap: apply transformation to the entire matrix T. */
 
- 	i__1 = *n - *j1 + 1;
 
- 	_starpu_dlarfx_("L", &c__3, &i__1, u, &tau, &t[*j1 + *j1 * t_dim1], ldt, &
 
- 		work[1]);
 
- 	_starpu_dlarfx_("R", &j2, &c__3, u, &tau, &t[*j1 * t_dim1 + 1], ldt, &work[1]);
 
- 	t[j3 + *j1 * t_dim1] = 0.;
 
- 	t[j3 + j2 * t_dim1] = 0.;
 
- 	t[j3 + j3 * t_dim1] = t11;
 
- 	if (*wantq) {
 
- /*           Accumulate transformation in the matrix Q. */
 
- 	    _starpu_dlarfx_("R", n, &c__3, u, &tau, &q[*j1 * q_dim1 + 1], ldq, &work[
 
- 		    1]);
 
- 	}
 
- 	goto L40;
 
- L20:
 
- /*        N1 = 2, N2 = 1: generate elementary reflector H so that: */
 
- /*        H (  -X11 ) = ( * ) */
 
- /*          (  -X21 ) = ( 0 ) */
 
- /*          ( scale ) = ( 0 ) */
 
- 	u[0] = -x[0];
 
- 	u[1] = -x[1];
 
- 	u[2] = scale;
 
- 	_starpu_dlarfg_(&c__3, u, &u[1], &c__1, &tau);
 
- 	u[0] = 1.;
 
- 	t33 = t[j3 + j3 * t_dim1];
 
- /*        Perform swap provisionally on diagonal block in D. */
 
- 	_starpu_dlarfx_("L", &c__3, &c__3, u, &tau, d__, &c__4, &work[1]);
 
- 	_starpu_dlarfx_("R", &c__3, &c__3, u, &tau, d__, &c__4, &work[1]);
 
- /*        Test whether to reject swap. */
 
- /* Computing MAX */
 
- 	d__2 = abs(d__[1]), d__3 = abs(d__[2]), d__2 = max(d__2,d__3), d__3 = 
 
- 		(d__1 = d__[0] - t33, abs(d__1));
 
- 	if (max(d__2,d__3) > thresh) {
 
- 	    goto L50;
 
- 	}
 
- /*        Accept swap: apply transformation to the entire matrix T. */
 
- 	_starpu_dlarfx_("R", &j3, &c__3, u, &tau, &t[*j1 * t_dim1 + 1], ldt, &work[1]);
 
- 	i__1 = *n - *j1;
 
- 	_starpu_dlarfx_("L", &c__3, &i__1, u, &tau, &t[*j1 + j2 * t_dim1], ldt, &work[
 
- 		1]);
 
- 	t[*j1 + *j1 * t_dim1] = t33;
 
- 	t[j2 + *j1 * t_dim1] = 0.;
 
- 	t[j3 + *j1 * t_dim1] = 0.;
 
- 	if (*wantq) {
 
- /*           Accumulate transformation in the matrix Q. */
 
- 	    _starpu_dlarfx_("R", n, &c__3, u, &tau, &q[*j1 * q_dim1 + 1], ldq, &work[
 
- 		    1]);
 
- 	}
 
- 	goto L40;
 
- L30:
 
- /*        N1 = 2, N2 = 2: generate elementary reflectors H(1) and H(2) so */
 
- /*        that: */
 
- /*        H(2) H(1) (  -X11  -X12 ) = (  *  * ) */
 
- /*                  (  -X21  -X22 )   (  0  * ) */
 
- /*                  ( scale    0  )   (  0  0 ) */
 
- /*                  (    0  scale )   (  0  0 ) */
 
- 	u1[0] = -x[0];
 
- 	u1[1] = -x[1];
 
- 	u1[2] = scale;
 
- 	_starpu_dlarfg_(&c__3, u1, &u1[1], &c__1, &tau1);
 
- 	u1[0] = 1.;
 
- 	temp = -tau1 * (x[2] + u1[1] * x[3]);
 
- 	u2[0] = -temp * u1[1] - x[3];
 
- 	u2[1] = -temp * u1[2];
 
- 	u2[2] = scale;
 
- 	_starpu_dlarfg_(&c__3, u2, &u2[1], &c__1, &tau2);
 
- 	u2[0] = 1.;
 
- /*        Perform swap provisionally on diagonal block in D. */
 
- 	_starpu_dlarfx_("L", &c__3, &c__4, u1, &tau1, d__, &c__4, &work[1])
 
- 		;
 
- 	_starpu_dlarfx_("R", &c__4, &c__3, u1, &tau1, d__, &c__4, &work[1])
 
- 		;
 
- 	_starpu_dlarfx_("L", &c__3, &c__4, u2, &tau2, &d__[1], &c__4, &work[1]);
 
- 	_starpu_dlarfx_("R", &c__4, &c__3, u2, &tau2, &d__[4], &c__4, &work[1]);
 
- /*        Test whether to reject swap. */
 
- /* Computing MAX */
 
- 	d__1 = abs(d__[2]), d__2 = abs(d__[6]), d__1 = max(d__1,d__2), d__2 = 
 
- 		abs(d__[3]), d__1 = max(d__1,d__2), d__2 = abs(d__[7]);
 
- 	if (max(d__1,d__2) > thresh) {
 
- 	    goto L50;
 
- 	}
 
- /*        Accept swap: apply transformation to the entire matrix T. */
 
- 	i__1 = *n - *j1 + 1;
 
- 	_starpu_dlarfx_("L", &c__3, &i__1, u1, &tau1, &t[*j1 + *j1 * t_dim1], ldt, &
 
- 		work[1]);
 
- 	_starpu_dlarfx_("R", &j4, &c__3, u1, &tau1, &t[*j1 * t_dim1 + 1], ldt, &work[
 
- 		1]);
 
- 	i__1 = *n - *j1 + 1;
 
- 	_starpu_dlarfx_("L", &c__3, &i__1, u2, &tau2, &t[j2 + *j1 * t_dim1], ldt, &
 
- 		work[1]);
 
- 	_starpu_dlarfx_("R", &j4, &c__3, u2, &tau2, &t[j2 * t_dim1 + 1], ldt, &work[1]
 
- );
 
- 	t[j3 + *j1 * t_dim1] = 0.;
 
- 	t[j3 + j2 * t_dim1] = 0.;
 
- 	t[j4 + *j1 * t_dim1] = 0.;
 
- 	t[j4 + j2 * t_dim1] = 0.;
 
- 	if (*wantq) {
 
- /*           Accumulate transformation in the matrix Q. */
 
- 	    _starpu_dlarfx_("R", n, &c__3, u1, &tau1, &q[*j1 * q_dim1 + 1], ldq, &
 
- 		    work[1]);
 
- 	    _starpu_dlarfx_("R", n, &c__3, u2, &tau2, &q[j2 * q_dim1 + 1], ldq, &work[
 
- 		    1]);
 
- 	}
 
- L40:
 
- 	if (*n2 == 2) {
 
- /*           Standardize new 2-by-2 block T11 */
 
- 	    _starpu_dlanv2_(&t[*j1 + *j1 * t_dim1], &t[*j1 + j2 * t_dim1], &t[j2 + *
 
- 		    j1 * t_dim1], &t[j2 + j2 * t_dim1], &wr1, &wi1, &wr2, &
 
- 		    wi2, &cs, &sn);
 
- 	    i__1 = *n - *j1 - 1;
 
- 	    _starpu_drot_(&i__1, &t[*j1 + (*j1 + 2) * t_dim1], ldt, &t[j2 + (*j1 + 2) 
 
- 		    * t_dim1], ldt, &cs, &sn);
 
- 	    i__1 = *j1 - 1;
 
- 	    _starpu_drot_(&i__1, &t[*j1 * t_dim1 + 1], &c__1, &t[j2 * t_dim1 + 1], &
 
- 		    c__1, &cs, &sn);
 
- 	    if (*wantq) {
 
- 		_starpu_drot_(n, &q[*j1 * q_dim1 + 1], &c__1, &q[j2 * q_dim1 + 1], &
 
- 			c__1, &cs, &sn);
 
- 	    }
 
- 	}
 
- 	if (*n1 == 2) {
 
- /*           Standardize new 2-by-2 block T22 */
 
- 	    j3 = *j1 + *n2;
 
- 	    j4 = j3 + 1;
 
- 	    _starpu_dlanv2_(&t[j3 + j3 * t_dim1], &t[j3 + j4 * t_dim1], &t[j4 + j3 * 
 
- 		    t_dim1], &t[j4 + j4 * t_dim1], &wr1, &wi1, &wr2, &wi2, &
 
- 		    cs, &sn);
 
- 	    if (j3 + 2 <= *n) {
 
- 		i__1 = *n - j3 - 1;
 
- 		_starpu_drot_(&i__1, &t[j3 + (j3 + 2) * t_dim1], ldt, &t[j4 + (j3 + 2)
 
- 			 * t_dim1], ldt, &cs, &sn);
 
- 	    }
 
- 	    i__1 = j3 - 1;
 
- 	    _starpu_drot_(&i__1, &t[j3 * t_dim1 + 1], &c__1, &t[j4 * t_dim1 + 1], &
 
- 		    c__1, &cs, &sn);
 
- 	    if (*wantq) {
 
- 		_starpu_drot_(n, &q[j3 * q_dim1 + 1], &c__1, &q[j4 * q_dim1 + 1], &
 
- 			c__1, &cs, &sn);
 
- 	    }
 
- 	}
 
-     }
 
-     return 0;
 
- /*     Exit with INFO = 1 if swap was rejected. */
 
- L50:
 
-     *info = 1;
 
-     return 0;
 
- /*     End of DLAEXC */
 
- } /* _starpu_dlaexc_ */
 
 
  |