123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- /* dlarfp.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"
- /* Subroutine */ int _starpu_dlarfp_(integer *n, doublereal *alpha, doublereal *x,
- integer *incx, doublereal *tau)
- {
- /* System generated locals */
- integer i__1;
- doublereal d__1;
- /* Builtin functions */
- double d_sign(doublereal *, doublereal *);
- /* Local variables */
- integer j, knt;
- doublereal beta;
- extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *);
- extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *,
- integer *);
- doublereal xnorm;
- extern doublereal _starpu_dlapy2_(doublereal *, doublereal *), _starpu_dlamch_(char *);
- doublereal safmin, rsafmn;
- /* -- LAPACK auxiliary routine (version 3.2) -- */
- /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
- /* November 2006 */
- /* .. Scalar Arguments .. */
- /* .. */
- /* .. Array Arguments .. */
- /* .. */
- /* Purpose */
- /* ======= */
- /* DLARFP generates a real elementary reflector H of order n, such */
- /* that */
- /* H * ( alpha ) = ( beta ), H' * H = I. */
- /* ( x ) ( 0 ) */
- /* where alpha and beta are scalars, beta is non-negative, and x is */
- /* an (n-1)-element real vector. H is represented in the form */
- /* H = I - tau * ( 1 ) * ( 1 v' ) , */
- /* ( v ) */
- /* where tau is a real scalar and v is a real (n-1)-element */
- /* vector. */
- /* If the elements of x are all zero, then tau = 0 and H is taken to be */
- /* the unit matrix. */
- /* Otherwise 1 <= tau <= 2. */
- /* Arguments */
- /* ========= */
- /* N (input) INTEGER */
- /* The order of the elementary reflector. */
- /* ALPHA (input/output) DOUBLE PRECISION */
- /* On entry, the value alpha. */
- /* On exit, it is overwritten with the value beta. */
- /* X (input/output) DOUBLE PRECISION array, dimension */
- /* (1+(N-2)*abs(INCX)) */
- /* On entry, the vector x. */
- /* On exit, it is overwritten with the vector v. */
- /* INCX (input) INTEGER */
- /* The increment between elements of X. INCX > 0. */
- /* TAU (output) DOUBLE PRECISION */
- /* The value tau. */
- /* ===================================================================== */
- /* .. Parameters .. */
- /* .. */
- /* .. Local Scalars .. */
- /* .. */
- /* .. External Functions .. */
- /* .. */
- /* .. Intrinsic Functions .. */
- /* .. */
- /* .. External Subroutines .. */
- /* .. */
- /* .. Executable Statements .. */
- /* Parameter adjustments */
- --x;
- /* Function Body */
- if (*n <= 0) {
- *tau = 0.;
- return 0;
- }
- i__1 = *n - 1;
- xnorm = _starpu_dnrm2_(&i__1, &x[1], incx);
- if (xnorm == 0.) {
- /* H = [+/-1, 0; I], sign chosen so ALPHA >= 0 */
- if (*alpha >= 0.) {
- /* When TAU.eq.ZERO, the vector is special-cased to be */
- /* all zeros in the application routines. We do not need */
- /* to clear it. */
- *tau = 0.;
- } else {
- /* However, the application routines rely on explicit */
- /* zero checks when TAU.ne.ZERO, and we must clear X. */
- *tau = 2.;
- i__1 = *n - 1;
- for (j = 1; j <= i__1; ++j) {
- x[(j - 1) * *incx + 1] = 0.;
- }
- *alpha = -(*alpha);
- }
- } else {
- /* general case */
- d__1 = _starpu_dlapy2_(alpha, &xnorm);
- beta = d_sign(&d__1, alpha);
- safmin = _starpu_dlamch_("S") / _starpu_dlamch_("E");
- knt = 0;
- if (abs(beta) < safmin) {
- /* XNORM, BETA may be inaccurate; scale X and recompute them */
- rsafmn = 1. / safmin;
- L10:
- ++knt;
- i__1 = *n - 1;
- _starpu_dscal_(&i__1, &rsafmn, &x[1], incx);
- beta *= rsafmn;
- *alpha *= rsafmn;
- if (abs(beta) < safmin) {
- goto L10;
- }
- /* New BETA is at most 1, at least SAFMIN */
- i__1 = *n - 1;
- xnorm = _starpu_dnrm2_(&i__1, &x[1], incx);
- d__1 = _starpu_dlapy2_(alpha, &xnorm);
- beta = d_sign(&d__1, alpha);
- }
- *alpha += beta;
- if (beta < 0.) {
- beta = -beta;
- *tau = -(*alpha) / beta;
- } else {
- *alpha = xnorm * (xnorm / *alpha);
- *tau = *alpha / beta;
- *alpha = -(*alpha);
- }
- i__1 = *n - 1;
- d__1 = 1. / *alpha;
- _starpu_dscal_(&i__1, &d__1, &x[1], incx);
- /* If BETA is subnormal, it may lose relative accuracy */
- i__1 = knt;
- for (j = 1; j <= i__1; ++j) {
- beta *= safmin;
- /* L20: */
- }
- *alpha = beta;
- }
- return 0;
- /* End of DLARFP */
- } /* _starpu_dlarfp_ */
|