| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 | /* dlasv2.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 doublereal c_b3 = 2.;static doublereal c_b4 = 1.;/* Subroutine */ int _starpu_dlasv2_(doublereal *f, doublereal *g, doublereal *h__, 	doublereal *ssmin, doublereal *ssmax, doublereal *snr, doublereal *	csr, doublereal *snl, doublereal *csl){    /* System generated locals */    doublereal d__1;    /* Builtin functions */    double sqrt(doublereal), d_sign(doublereal *, doublereal *);    /* Local variables */    doublereal a, d__, l, m, r__, s, t, fa, ga, ha, ft, gt, ht, mm, tt, clt, 	    crt, slt, srt;    integer pmax;    doublereal temp;    logical swap;    doublereal tsign;    extern doublereal _starpu_dlamch_(char *);    logical gasmal;/*  -- LAPACK auxiliary routine (version 3.2) -- *//*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. *//*     November 2006 *//*     .. Scalar Arguments .. *//*     .. *//*  Purpose *//*  ======= *//*  DLASV2 computes the singular value decomposition of a 2-by-2 *//*  triangular matrix *//*     [  F   G  ] *//*     [  0   H  ]. *//*  On return, abs(SSMAX) is the larger singular value, abs(SSMIN) is the *//*  smaller singular value, and (CSL,SNL) and (CSR,SNR) are the left and *//*  right singular vectors for abs(SSMAX), giving the decomposition *//*     [ CSL  SNL ] [  F   G  ] [ CSR -SNR ]  =  [ SSMAX   0   ] *//*     [-SNL  CSL ] [  0   H  ] [ SNR  CSR ]     [  0    SSMIN ]. *//*  Arguments *//*  ========= *//*  F       (input) DOUBLE PRECISION *//*          The (1,1) element of the 2-by-2 matrix. *//*  G       (input) DOUBLE PRECISION *//*          The (1,2) element of the 2-by-2 matrix. *//*  H       (input) DOUBLE PRECISION *//*          The (2,2) element of the 2-by-2 matrix. *//*  SSMIN   (output) DOUBLE PRECISION *//*          abs(SSMIN) is the smaller singular value. *//*  SSMAX   (output) DOUBLE PRECISION *//*          abs(SSMAX) is the larger singular value. *//*  SNL     (output) DOUBLE PRECISION *//*  CSL     (output) DOUBLE PRECISION *//*          The vector (CSL, SNL) is a unit left singular vector for the *//*          singular value abs(SSMAX). *//*  SNR     (output) DOUBLE PRECISION *//*  CSR     (output) DOUBLE PRECISION *//*          The vector (CSR, SNR) is a unit right singular vector for the *//*          singular value abs(SSMAX). *//*  Further Details *//*  =============== *//*  Any input parameter may be aliased with any output parameter. *//*  Barring over/underflow and assuming a guard digit in subtraction, all *//*  output quantities are correct to within a few units in the last *//*  place (ulps). *//*  In IEEE arithmetic, the code works correctly if one matrix element is *//*  infinite. *//*  Overflow will not occur unless the largest singular value itself *//*  overflows or is within a few ulps of overflow. (On machines with *//*  partial overflow, like the Cray, overflow may occur if the largest *//*  singular value is within a factor of 2 of overflow.) *//*  Underflow is harmless if underflow is gradual. Otherwise, results *//*  may correspond to a matrix modified by perturbations of size near *//*  the underflow threshold. *//* ===================================================================== *//*     .. Parameters .. *//*     .. *//*     .. Local Scalars .. *//*     .. *//*     .. Intrinsic Functions .. *//*     .. *//*     .. External Functions .. *//*     .. *//*     .. Executable Statements .. */    ft = *f;    fa = abs(ft);    ht = *h__;    ha = abs(*h__);/*     PMAX points to the maximum absolute element of matrix *//*       PMAX = 1 if F largest in absolute values *//*       PMAX = 2 if G largest in absolute values *//*       PMAX = 3 if H largest in absolute values */    pmax = 1;    swap = ha > fa;    if (swap) {	pmax = 3;	temp = ft;	ft = ht;	ht = temp;	temp = fa;	fa = ha;	ha = temp;/*        Now FA .ge. HA */    }    gt = *g;    ga = abs(gt);    if (ga == 0.) {/*        Diagonal matrix */	*ssmin = ha;	*ssmax = fa;	clt = 1.;	crt = 1.;	slt = 0.;	srt = 0.;    } else {	gasmal = TRUE_;	if (ga > fa) {	    pmax = 2;	    if (fa / ga < _starpu_dlamch_("EPS")) {/*              Case of very large GA */		gasmal = FALSE_;		*ssmax = ga;		if (ha > 1.) {		    *ssmin = fa / (ga / ha);		} else {		    *ssmin = fa / ga * ha;		}		clt = 1.;		slt = ht / gt;		srt = 1.;		crt = ft / gt;	    }	}	if (gasmal) {/*           Normal case */	    d__ = fa - ha;	    if (d__ == fa) {/*              Copes with infinite F or H */		l = 1.;	    } else {		l = d__ / fa;	    }/*           Note that 0 .le. L .le. 1 */	    m = gt / ft;/*           Note that abs(M) .le. 1/macheps */	    t = 2. - l;/*           Note that T .ge. 1 */	    mm = m * m;	    tt = t * t;	    s = sqrt(tt + mm);/*           Note that 1 .le. S .le. 1 + 1/macheps */	    if (l == 0.) {		r__ = abs(m);	    } else {		r__ = sqrt(l * l + mm);	    }/*           Note that 0 .le. R .le. 1 + 1/macheps */	    a = (s + r__) * .5;/*           Note that 1 .le. A .le. 1 + abs(M) */	    *ssmin = ha / a;	    *ssmax = fa * a;	    if (mm == 0.) {/*              Note that M is very tiny */		if (l == 0.) {		    t = d_sign(&c_b3, &ft) * d_sign(&c_b4, >);		} else {		    t = gt / d_sign(&d__, &ft) + m / t;		}	    } else {		t = (m / (s + t) + m / (r__ + l)) * (a + 1.);	    }	    l = sqrt(t * t + 4.);	    crt = 2. / l;	    srt = t / l;	    clt = (crt + srt * m) / a;	    slt = ht / ft * srt / a;	}    }    if (swap) {	*csl = srt;	*snl = crt;	*csr = slt;	*snr = clt;    } else {	*csl = clt;	*snl = slt;	*csr = crt;	*snr = srt;    }/*     Correct signs of SSMAX and SSMIN */    if (pmax == 1) {	tsign = d_sign(&c_b4, csr) * d_sign(&c_b4, csl) * d_sign(&c_b4, f);    }    if (pmax == 2) {	tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, csl) * d_sign(&c_b4, g);    }    if (pmax == 3) {	tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, snl) * d_sign(&c_b4, h__);    }    *ssmax = d_sign(ssmax, &tsign);    d__1 = tsign * d_sign(&c_b4, f) * d_sign(&c_b4, h__);    *ssmin = d_sign(ssmin, &d__1);    return 0;/*     End of DLASV2 */} /* _starpu_dlasv2_ */
 |