123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- /* dgebak.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_dgebak_(char *job, char *side, integer *n, integer *ilo,
- integer *ihi, doublereal *scale, integer *m, doublereal *v, integer *
- ldv, integer *info)
- {
- /* System generated locals */
- integer v_dim1, v_offset, i__1;
- /* Local variables */
- integer i__, k;
- doublereal s;
- integer ii;
- extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *,
- integer *);
- extern logical _starpu_lsame_(char *, char *);
- extern /* Subroutine */ int _starpu_dswap_(integer *, doublereal *, integer *,
- doublereal *, integer *);
- logical leftv;
- extern /* Subroutine */ int _starpu_xerbla_(char *, integer *);
- logical rightv;
- /* -- LAPACK routine (version 3.2) -- */
- /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
- /* November 2006 */
- /* .. Scalar Arguments .. */
- /* .. */
- /* .. Array Arguments .. */
- /* .. */
- /* Purpose */
- /* ======= */
- /* DGEBAK forms the right or left eigenvectors of a real general matrix */
- /* by backward transformation on the computed eigenvectors of the */
- /* balanced matrix output by DGEBAL. */
- /* Arguments */
- /* ========= */
- /* JOB (input) CHARACTER*1 */
- /* Specifies the type of backward transformation required: */
- /* = 'N', do nothing, return immediately; */
- /* = 'P', do backward transformation for permutation only; */
- /* = 'S', do backward transformation for scaling only; */
- /* = 'B', do backward transformations for both permutation and */
- /* scaling. */
- /* JOB must be the same as the argument JOB supplied to DGEBAL. */
- /* SIDE (input) CHARACTER*1 */
- /* = 'R': V contains right eigenvectors; */
- /* = 'L': V contains left eigenvectors. */
- /* N (input) INTEGER */
- /* The number of rows of the matrix V. N >= 0. */
- /* ILO (input) INTEGER */
- /* IHI (input) INTEGER */
- /* The integers ILO and IHI determined by DGEBAL. */
- /* 1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0. */
- /* SCALE (input) DOUBLE PRECISION array, dimension (N) */
- /* Details of the permutation and scaling factors, as returned */
- /* by DGEBAL. */
- /* M (input) INTEGER */
- /* The number of columns of the matrix V. M >= 0. */
- /* V (input/output) DOUBLE PRECISION array, dimension (LDV,M) */
- /* On entry, the matrix of right or left eigenvectors to be */
- /* transformed, as returned by DHSEIN or DTREVC. */
- /* On exit, V is overwritten by the transformed eigenvectors. */
- /* LDV (input) INTEGER */
- /* The leading dimension of the array V. LDV >= max(1,N). */
- /* INFO (output) INTEGER */
- /* = 0: successful exit */
- /* < 0: if INFO = -i, the i-th argument had an illegal value. */
- /* ===================================================================== */
- /* .. Parameters .. */
- /* .. */
- /* .. Local Scalars .. */
- /* .. */
- /* .. External Functions .. */
- /* .. */
- /* .. External Subroutines .. */
- /* .. */
- /* .. Intrinsic Functions .. */
- /* .. */
- /* .. Executable Statements .. */
- /* Decode and Test the input parameters */
- /* Parameter adjustments */
- --scale;
- v_dim1 = *ldv;
- v_offset = 1 + v_dim1;
- v -= v_offset;
- /* Function Body */
- rightv = _starpu_lsame_(side, "R");
- leftv = _starpu_lsame_(side, "L");
- *info = 0;
- if (! _starpu_lsame_(job, "N") && ! _starpu_lsame_(job, "P") && ! _starpu_lsame_(job, "S")
- && ! _starpu_lsame_(job, "B")) {
- *info = -1;
- } else if (! rightv && ! leftv) {
- *info = -2;
- } else if (*n < 0) {
- *info = -3;
- } else if (*ilo < 1 || *ilo > max(1,*n)) {
- *info = -4;
- } else if (*ihi < min(*ilo,*n) || *ihi > *n) {
- *info = -5;
- } else if (*m < 0) {
- *info = -7;
- } else if (*ldv < max(1,*n)) {
- *info = -9;
- }
- if (*info != 0) {
- i__1 = -(*info);
- _starpu_xerbla_("DGEBAK", &i__1);
- return 0;
- }
- /* Quick return if possible */
- if (*n == 0) {
- return 0;
- }
- if (*m == 0) {
- return 0;
- }
- if (_starpu_lsame_(job, "N")) {
- return 0;
- }
- if (*ilo == *ihi) {
- goto L30;
- }
- /* Backward balance */
- if (_starpu_lsame_(job, "S") || _starpu_lsame_(job, "B")) {
- if (rightv) {
- i__1 = *ihi;
- for (i__ = *ilo; i__ <= i__1; ++i__) {
- s = scale[i__];
- _starpu_dscal_(m, &s, &v[i__ + v_dim1], ldv);
- /* L10: */
- }
- }
- if (leftv) {
- i__1 = *ihi;
- for (i__ = *ilo; i__ <= i__1; ++i__) {
- s = 1. / scale[i__];
- _starpu_dscal_(m, &s, &v[i__ + v_dim1], ldv);
- /* L20: */
- }
- }
- }
- /* Backward permutation */
- /* For I = ILO-1 step -1 until 1, */
- /* IHI+1 step 1 until N do -- */
- L30:
- if (_starpu_lsame_(job, "P") || _starpu_lsame_(job, "B")) {
- if (rightv) {
- i__1 = *n;
- for (ii = 1; ii <= i__1; ++ii) {
- i__ = ii;
- if (i__ >= *ilo && i__ <= *ihi) {
- goto L40;
- }
- if (i__ < *ilo) {
- i__ = *ilo - ii;
- }
- k = (integer) scale[i__];
- if (k == i__) {
- goto L40;
- }
- _starpu_dswap_(m, &v[i__ + v_dim1], ldv, &v[k + v_dim1], ldv);
- L40:
- ;
- }
- }
- if (leftv) {
- i__1 = *n;
- for (ii = 1; ii <= i__1; ++ii) {
- i__ = ii;
- if (i__ >= *ilo && i__ <= *ihi) {
- goto L50;
- }
- if (i__ < *ilo) {
- i__ = *ilo - ii;
- }
- k = (integer) scale[i__];
- if (k == i__) {
- goto L50;
- }
- _starpu_dswap_(m, &v[i__ + v_dim1], ldv, &v[k + v_dim1], ldv);
- L50:
- ;
- }
- }
- }
- return 0;
- /* End of DGEBAK */
- } /* _starpu_dgebak_ */
|