dtrsna.c
Go to the documentation of this file.
00001 /* dtrsna.f -- translated by f2c (version 20061008).
00002    You must link the resulting object file with libf2c:
00003         on Microsoft Windows system, link with libf2c.lib;
00004         on Linux or Unix systems, link with .../path/to/libf2c.a -lm
00005         or, if you install libf2c.a in a standard place, with -lf2c -lm
00006         -- in that order, at the end of the command line, as in
00007                 cc *.o -lf2c -lm
00008         Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
00009 
00010                 http://www.netlib.org/f2c/libf2c.zip
00011 */
00012 
00013 #include "f2c.h"
00014 #include "blaswrap.h"
00015 
00016 /* Table of constant values */
00017 
00018 static integer c__1 = 1;
00019 static logical c_true = TRUE_;
00020 static logical c_false = FALSE_;
00021 
00022 /* Subroutine */ int dtrsna_(char *job, char *howmny, logical *select, 
00023         integer *n, doublereal *t, integer *ldt, doublereal *vl, integer *
00024         ldvl, doublereal *vr, integer *ldvr, doublereal *s, doublereal *sep, 
00025         integer *mm, integer *m, doublereal *work, integer *ldwork, integer *
00026         iwork, integer *info)
00027 {
00028     /* System generated locals */
00029     integer t_dim1, t_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, 
00030             work_dim1, work_offset, i__1, i__2;
00031     doublereal d__1, d__2;
00032 
00033     /* Builtin functions */
00034     double sqrt(doublereal);
00035 
00036     /* Local variables */
00037     integer i__, j, k, n2;
00038     doublereal cs;
00039     integer nn, ks;
00040     doublereal sn, mu, eps, est;
00041     integer kase;
00042     doublereal cond;
00043     extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, 
00044             integer *);
00045     logical pair;
00046     integer ierr;
00047     doublereal dumm, prod;
00048     integer ifst;
00049     doublereal lnrm;
00050     integer ilst;
00051     doublereal rnrm;
00052     extern doublereal dnrm2_(integer *, doublereal *, integer *);
00053     doublereal prod1, prod2, scale, delta;
00054     extern logical lsame_(char *, char *);
00055     integer isave[3];
00056     logical wants;
00057     doublereal dummy[1];
00058     extern /* Subroutine */ int dlacn2_(integer *, doublereal *, doublereal *, 
00059              integer *, doublereal *, integer *, integer *);
00060     extern doublereal dlapy2_(doublereal *, doublereal *);
00061     extern /* Subroutine */ int dlabad_(doublereal *, doublereal *);
00062     extern doublereal dlamch_(char *);
00063     extern /* Subroutine */ int dlacpy_(char *, integer *, integer *, 
00064             doublereal *, integer *, doublereal *, integer *), 
00065             xerbla_(char *, integer *);
00066     doublereal bignum;
00067     logical wantbh;
00068     extern /* Subroutine */ int dlaqtr_(logical *, logical *, integer *, 
00069             doublereal *, integer *, doublereal *, doublereal *, doublereal *, 
00070              doublereal *, doublereal *, integer *), dtrexc_(char *, integer *
00071 , doublereal *, integer *, doublereal *, integer *, integer *, 
00072             integer *, doublereal *, integer *);
00073     logical somcon;
00074     doublereal smlnum;
00075     logical wantsp;
00076 
00077 
00078 /*  -- LAPACK routine (version 3.2) -- */
00079 /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
00080 /*     November 2006 */
00081 
00082 /*     Modified to call DLACN2 in place of DLACON, 5 Feb 03, SJH. */
00083 
00084 /*     .. Scalar Arguments .. */
00085 /*     .. */
00086 /*     .. Array Arguments .. */
00087 /*     .. */
00088 
00089 /*  Purpose */
00090 /*  ======= */
00091 
00092 /*  DTRSNA estimates reciprocal condition numbers for specified */
00093 /*  eigenvalues and/or right eigenvectors of a real upper */
00094 /*  quasi-triangular matrix T (or of any matrix Q*T*Q**T with Q */
00095 /*  orthogonal). */
00096 
00097 /*  T must be in Schur canonical form (as returned by DHSEQR), that is, */
00098 /*  block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each */
00099 /*  2-by-2 diagonal block has its diagonal elements equal and its */
00100 /*  off-diagonal elements of opposite sign. */
00101 
00102 /*  Arguments */
00103 /*  ========= */
00104 
00105 /*  JOB     (input) CHARACTER*1 */
00106 /*          Specifies whether condition numbers are required for */
00107 /*          eigenvalues (S) or eigenvectors (SEP): */
00108 /*          = 'E': for eigenvalues only (S); */
00109 /*          = 'V': for eigenvectors only (SEP); */
00110 /*          = 'B': for both eigenvalues and eigenvectors (S and SEP). */
00111 
00112 /*  HOWMNY  (input) CHARACTER*1 */
00113 /*          = 'A': compute condition numbers for all eigenpairs; */
00114 /*          = 'S': compute condition numbers for selected eigenpairs */
00115 /*                 specified by the array SELECT. */
00116 
00117 /*  SELECT  (input) LOGICAL array, dimension (N) */
00118 /*          If HOWMNY = 'S', SELECT specifies the eigenpairs for which */
00119 /*          condition numbers are required. To select condition numbers */
00120 /*          for the eigenpair corresponding to a real eigenvalue w(j), */
00121 /*          SELECT(j) must be set to .TRUE.. To select condition numbers */
00122 /*          corresponding to a complex conjugate pair of eigenvalues w(j) */
00123 /*          and w(j+1), either SELECT(j) or SELECT(j+1) or both, must be */
00124 /*          set to .TRUE.. */
00125 /*          If HOWMNY = 'A', SELECT is not referenced. */
00126 
00127 /*  N       (input) INTEGER */
00128 /*          The order of the matrix T. N >= 0. */
00129 
00130 /*  T       (input) DOUBLE PRECISION array, dimension (LDT,N) */
00131 /*          The upper quasi-triangular matrix T, in Schur canonical form. */
00132 
00133 /*  LDT     (input) INTEGER */
00134 /*          The leading dimension of the array T. LDT >= max(1,N). */
00135 
00136 /*  VL      (input) DOUBLE PRECISION array, dimension (LDVL,M) */
00137 /*          If JOB = 'E' or 'B', VL must contain left eigenvectors of T */
00138 /*          (or of any Q*T*Q**T with Q orthogonal), corresponding to the */
00139 /*          eigenpairs specified by HOWMNY and SELECT. The eigenvectors */
00140 /*          must be stored in consecutive columns of VL, as returned by */
00141 /*          DHSEIN or DTREVC. */
00142 /*          If JOB = 'V', VL is not referenced. */
00143 
00144 /*  LDVL    (input) INTEGER */
00145 /*          The leading dimension of the array VL. */
00146 /*          LDVL >= 1; and if JOB = 'E' or 'B', LDVL >= N. */
00147 
00148 /*  VR      (input) DOUBLE PRECISION array, dimension (LDVR,M) */
00149 /*          If JOB = 'E' or 'B', VR must contain right eigenvectors of T */
00150 /*          (or of any Q*T*Q**T with Q orthogonal), corresponding to the */
00151 /*          eigenpairs specified by HOWMNY and SELECT. The eigenvectors */
00152 /*          must be stored in consecutive columns of VR, as returned by */
00153 /*          DHSEIN or DTREVC. */
00154 /*          If JOB = 'V', VR is not referenced. */
00155 
00156 /*  LDVR    (input) INTEGER */
00157 /*          The leading dimension of the array VR. */
00158 /*          LDVR >= 1; and if JOB = 'E' or 'B', LDVR >= N. */
00159 
00160 /*  S       (output) DOUBLE PRECISION array, dimension (MM) */
00161 /*          If JOB = 'E' or 'B', the reciprocal condition numbers of the */
00162 /*          selected eigenvalues, stored in consecutive elements of the */
00163 /*          array. For a complex conjugate pair of eigenvalues two */
00164 /*          consecutive elements of S are set to the same value. Thus */
00165 /*          S(j), SEP(j), and the j-th columns of VL and VR all */
00166 /*          correspond to the same eigenpair (but not in general the */
00167 /*          j-th eigenpair, unless all eigenpairs are selected). */
00168 /*          If JOB = 'V', S is not referenced. */
00169 
00170 /*  SEP     (output) DOUBLE PRECISION array, dimension (MM) */
00171 /*          If JOB = 'V' or 'B', the estimated reciprocal condition */
00172 /*          numbers of the selected eigenvectors, stored in consecutive */
00173 /*          elements of the array. For a complex eigenvector two */
00174 /*          consecutive elements of SEP are set to the same value. If */
00175 /*          the eigenvalues cannot be reordered to compute SEP(j), SEP(j) */
00176 /*          is set to 0; this can only occur when the true value would be */
00177 /*          very small anyway. */
00178 /*          If JOB = 'E', SEP is not referenced. */
00179 
00180 /*  MM      (input) INTEGER */
00181 /*          The number of elements in the arrays S (if JOB = 'E' or 'B') */
00182 /*           and/or SEP (if JOB = 'V' or 'B'). MM >= M. */
00183 
00184 /*  M       (output) INTEGER */
00185 /*          The number of elements of the arrays S and/or SEP actually */
00186 /*          used to store the estimated condition numbers. */
00187 /*          If HOWMNY = 'A', M is set to N. */
00188 
00189 /*  WORK    (workspace) DOUBLE PRECISION array, dimension (LDWORK,N+6) */
00190 /*          If JOB = 'E', WORK is not referenced. */
00191 
00192 /*  LDWORK  (input) INTEGER */
00193 /*          The leading dimension of the array WORK. */
00194 /*          LDWORK >= 1; and if JOB = 'V' or 'B', LDWORK >= N. */
00195 
00196 /*  IWORK   (workspace) INTEGER array, dimension (2*(N-1)) */
00197 /*          If JOB = 'E', IWORK is not referenced. */
00198 
00199 /*  INFO    (output) INTEGER */
00200 /*          = 0: successful exit */
00201 /*          < 0: if INFO = -i, the i-th argument had an illegal value */
00202 
00203 /*  Further Details */
00204 /*  =============== */
00205 
00206 /*  The reciprocal of the condition number of an eigenvalue lambda is */
00207 /*  defined as */
00208 
00209 /*          S(lambda) = |v'*u| / (norm(u)*norm(v)) */
00210 
00211 /*  where u and v are the right and left eigenvectors of T corresponding */
00212 /*  to lambda; v' denotes the conjugate-transpose of v, and norm(u) */
00213 /*  denotes the Euclidean norm. These reciprocal condition numbers always */
00214 /*  lie between zero (very badly conditioned) and one (very well */
00215 /*  conditioned). If n = 1, S(lambda) is defined to be 1. */
00216 
00217 /*  An approximate error bound for a computed eigenvalue W(i) is given by */
00218 
00219 /*                      EPS * norm(T) / S(i) */
00220 
00221 /*  where EPS is the machine precision. */
00222 
00223 /*  The reciprocal of the condition number of the right eigenvector u */
00224 /*  corresponding to lambda is defined as follows. Suppose */
00225 
00226 /*              T = ( lambda  c  ) */
00227 /*                  (   0    T22 ) */
00228 
00229 /*  Then the reciprocal condition number is */
00230 
00231 /*          SEP( lambda, T22 ) = sigma-min( T22 - lambda*I ) */
00232 
00233 /*  where sigma-min denotes the smallest singular value. We approximate */
00234 /*  the smallest singular value by the reciprocal of an estimate of the */
00235 /*  one-norm of the inverse of T22 - lambda*I. If n = 1, SEP(1) is */
00236 /*  defined to be abs(T(1,1)). */
00237 
00238 /*  An approximate error bound for a computed right eigenvector VR(i) */
00239 /*  is given by */
00240 
00241 /*                      EPS * norm(T) / SEP(i) */
00242 
00243 /*  ===================================================================== */
00244 
00245 /*     .. Parameters .. */
00246 /*     .. */
00247 /*     .. Local Scalars .. */
00248 /*     .. */
00249 /*     .. Local Arrays .. */
00250 /*     .. */
00251 /*     .. External Functions .. */
00252 /*     .. */
00253 /*     .. External Subroutines .. */
00254 /*     .. */
00255 /*     .. Intrinsic Functions .. */
00256 /*     .. */
00257 /*     .. Executable Statements .. */
00258 
00259 /*     Decode and test the input parameters */
00260 
00261     /* Parameter adjustments */
00262     --select;
00263     t_dim1 = *ldt;
00264     t_offset = 1 + t_dim1;
00265     t -= t_offset;
00266     vl_dim1 = *ldvl;
00267     vl_offset = 1 + vl_dim1;
00268     vl -= vl_offset;
00269     vr_dim1 = *ldvr;
00270     vr_offset = 1 + vr_dim1;
00271     vr -= vr_offset;
00272     --s;
00273     --sep;
00274     work_dim1 = *ldwork;
00275     work_offset = 1 + work_dim1;
00276     work -= work_offset;
00277     --iwork;
00278 
00279     /* Function Body */
00280     wantbh = lsame_(job, "B");
00281     wants = lsame_(job, "E") || wantbh;
00282     wantsp = lsame_(job, "V") || wantbh;
00283 
00284     somcon = lsame_(howmny, "S");
00285 
00286     *info = 0;
00287     if (! wants && ! wantsp) {
00288         *info = -1;
00289     } else if (! lsame_(howmny, "A") && ! somcon) {
00290         *info = -2;
00291     } else if (*n < 0) {
00292         *info = -4;
00293     } else if (*ldt < max(1,*n)) {
00294         *info = -6;
00295     } else if (*ldvl < 1 || wants && *ldvl < *n) {
00296         *info = -8;
00297     } else if (*ldvr < 1 || wants && *ldvr < *n) {
00298         *info = -10;
00299     } else {
00300 
00301 /*        Set M to the number of eigenpairs for which condition numbers */
00302 /*        are required, and test MM. */
00303 
00304         if (somcon) {
00305             *m = 0;
00306             pair = FALSE_;
00307             i__1 = *n;
00308             for (k = 1; k <= i__1; ++k) {
00309                 if (pair) {
00310                     pair = FALSE_;
00311                 } else {
00312                     if (k < *n) {
00313                         if (t[k + 1 + k * t_dim1] == 0.) {
00314                             if (select[k]) {
00315                                 ++(*m);
00316                             }
00317                         } else {
00318                             pair = TRUE_;
00319                             if (select[k] || select[k + 1]) {
00320                                 *m += 2;
00321                             }
00322                         }
00323                     } else {
00324                         if (select[*n]) {
00325                             ++(*m);
00326                         }
00327                     }
00328                 }
00329 /* L10: */
00330             }
00331         } else {
00332             *m = *n;
00333         }
00334 
00335         if (*mm < *m) {
00336             *info = -13;
00337         } else if (*ldwork < 1 || wantsp && *ldwork < *n) {
00338             *info = -16;
00339         }
00340     }
00341     if (*info != 0) {
00342         i__1 = -(*info);
00343         xerbla_("DTRSNA", &i__1);
00344         return 0;
00345     }
00346 
00347 /*     Quick return if possible */
00348 
00349     if (*n == 0) {
00350         return 0;
00351     }
00352 
00353     if (*n == 1) {
00354         if (somcon) {
00355             if (! select[1]) {
00356                 return 0;
00357             }
00358         }
00359         if (wants) {
00360             s[1] = 1.;
00361         }
00362         if (wantsp) {
00363             sep[1] = (d__1 = t[t_dim1 + 1], abs(d__1));
00364         }
00365         return 0;
00366     }
00367 
00368 /*     Get machine constants */
00369 
00370     eps = dlamch_("P");
00371     smlnum = dlamch_("S") / eps;
00372     bignum = 1. / smlnum;
00373     dlabad_(&smlnum, &bignum);
00374 
00375     ks = 0;
00376     pair = FALSE_;
00377     i__1 = *n;
00378     for (k = 1; k <= i__1; ++k) {
00379 
00380 /*        Determine whether T(k,k) begins a 1-by-1 or 2-by-2 block. */
00381 
00382         if (pair) {
00383             pair = FALSE_;
00384             goto L60;
00385         } else {
00386             if (k < *n) {
00387                 pair = t[k + 1 + k * t_dim1] != 0.;
00388             }
00389         }
00390 
00391 /*        Determine whether condition numbers are required for the k-th */
00392 /*        eigenpair. */
00393 
00394         if (somcon) {
00395             if (pair) {
00396                 if (! select[k] && ! select[k + 1]) {
00397                     goto L60;
00398                 }
00399             } else {
00400                 if (! select[k]) {
00401                     goto L60;
00402                 }
00403             }
00404         }
00405 
00406         ++ks;
00407 
00408         if (wants) {
00409 
00410 /*           Compute the reciprocal condition number of the k-th */
00411 /*           eigenvalue. */
00412 
00413             if (! pair) {
00414 
00415 /*              Real eigenvalue. */
00416 
00417                 prod = ddot_(n, &vr[ks * vr_dim1 + 1], &c__1, &vl[ks * 
00418                         vl_dim1 + 1], &c__1);
00419                 rnrm = dnrm2_(n, &vr[ks * vr_dim1 + 1], &c__1);
00420                 lnrm = dnrm2_(n, &vl[ks * vl_dim1 + 1], &c__1);
00421                 s[ks] = abs(prod) / (rnrm * lnrm);
00422             } else {
00423 
00424 /*              Complex eigenvalue. */
00425 
00426                 prod1 = ddot_(n, &vr[ks * vr_dim1 + 1], &c__1, &vl[ks * 
00427                         vl_dim1 + 1], &c__1);
00428                 prod1 += ddot_(n, &vr[(ks + 1) * vr_dim1 + 1], &c__1, &vl[(ks 
00429                         + 1) * vl_dim1 + 1], &c__1);
00430                 prod2 = ddot_(n, &vl[ks * vl_dim1 + 1], &c__1, &vr[(ks + 1) * 
00431                         vr_dim1 + 1], &c__1);
00432                 prod2 -= ddot_(n, &vl[(ks + 1) * vl_dim1 + 1], &c__1, &vr[ks *
00433                          vr_dim1 + 1], &c__1);
00434                 d__1 = dnrm2_(n, &vr[ks * vr_dim1 + 1], &c__1);
00435                 d__2 = dnrm2_(n, &vr[(ks + 1) * vr_dim1 + 1], &c__1);
00436                 rnrm = dlapy2_(&d__1, &d__2);
00437                 d__1 = dnrm2_(n, &vl[ks * vl_dim1 + 1], &c__1);
00438                 d__2 = dnrm2_(n, &vl[(ks + 1) * vl_dim1 + 1], &c__1);
00439                 lnrm = dlapy2_(&d__1, &d__2);
00440                 cond = dlapy2_(&prod1, &prod2) / (rnrm * lnrm);
00441                 s[ks] = cond;
00442                 s[ks + 1] = cond;
00443             }
00444         }
00445 
00446         if (wantsp) {
00447 
00448 /*           Estimate the reciprocal condition number of the k-th */
00449 /*           eigenvector. */
00450 
00451 /*           Copy the matrix T to the array WORK and swap the diagonal */
00452 /*           block beginning at T(k,k) to the (1,1) position. */
00453 
00454             dlacpy_("Full", n, n, &t[t_offset], ldt, &work[work_offset], 
00455                     ldwork);
00456             ifst = k;
00457             ilst = 1;
00458             dtrexc_("No Q", n, &work[work_offset], ldwork, dummy, &c__1, &
00459                     ifst, &ilst, &work[(*n + 1) * work_dim1 + 1], &ierr);
00460 
00461             if (ierr == 1 || ierr == 2) {
00462 
00463 /*              Could not swap because blocks not well separated */
00464 
00465                 scale = 1.;
00466                 est = bignum;
00467             } else {
00468 
00469 /*              Reordering successful */
00470 
00471                 if (work[work_dim1 + 2] == 0.) {
00472 
00473 /*                 Form C = T22 - lambda*I in WORK(2:N,2:N). */
00474 
00475                     i__2 = *n;
00476                     for (i__ = 2; i__ <= i__2; ++i__) {
00477                         work[i__ + i__ * work_dim1] -= work[work_dim1 + 1];
00478 /* L20: */
00479                     }
00480                     n2 = 1;
00481                     nn = *n - 1;
00482                 } else {
00483 
00484 /*                 Triangularize the 2 by 2 block by unitary */
00485 /*                 transformation U = [  cs   i*ss ] */
00486 /*                                    [ i*ss   cs  ]. */
00487 /*                 such that the (1,1) position of WORK is complex */
00488 /*                 eigenvalue lambda with positive imaginary part. (2,2) */
00489 /*                 position of WORK is the complex eigenvalue lambda */
00490 /*                 with negative imaginary  part. */
00491 
00492                     mu = sqrt((d__1 = work[(work_dim1 << 1) + 1], abs(d__1))) 
00493                             * sqrt((d__2 = work[work_dim1 + 2], abs(d__2)));
00494                     delta = dlapy2_(&mu, &work[work_dim1 + 2]);
00495                     cs = mu / delta;
00496                     sn = -work[work_dim1 + 2] / delta;
00497 
00498 /*                 Form */
00499 
00500 /*                 C' = WORK(2:N,2:N) + i*[rwork(1) ..... rwork(n-1) ] */
00501 /*                                        [   mu                     ] */
00502 /*                                        [         ..               ] */
00503 /*                                        [             ..           ] */
00504 /*                                        [                  mu      ] */
00505 /*                 where C' is conjugate transpose of complex matrix C, */
00506 /*                 and RWORK is stored starting in the N+1-st column of */
00507 /*                 WORK. */
00508 
00509                     i__2 = *n;
00510                     for (j = 3; j <= i__2; ++j) {
00511                         work[j * work_dim1 + 2] = cs * work[j * work_dim1 + 2]
00512                                 ;
00513                         work[j + j * work_dim1] -= work[work_dim1 + 1];
00514 /* L30: */
00515                     }
00516                     work[(work_dim1 << 1) + 2] = 0.;
00517 
00518                     work[(*n + 1) * work_dim1 + 1] = mu * 2.;
00519                     i__2 = *n - 1;
00520                     for (i__ = 2; i__ <= i__2; ++i__) {
00521                         work[i__ + (*n + 1) * work_dim1] = sn * work[(i__ + 1)
00522                                  * work_dim1 + 1];
00523 /* L40: */
00524                     }
00525                     n2 = 2;
00526                     nn = *n - 1 << 1;
00527                 }
00528 
00529 /*              Estimate norm(inv(C')) */
00530 
00531                 est = 0.;
00532                 kase = 0;
00533 L50:
00534                 dlacn2_(&nn, &work[(*n + 2) * work_dim1 + 1], &work[(*n + 4) *
00535                          work_dim1 + 1], &iwork[1], &est, &kase, isave);
00536                 if (kase != 0) {
00537                     if (kase == 1) {
00538                         if (n2 == 1) {
00539 
00540 /*                       Real eigenvalue: solve C'*x = scale*c. */
00541 
00542                             i__2 = *n - 1;
00543                             dlaqtr_(&c_true, &c_true, &i__2, &work[(work_dim1 
00544                                     << 1) + 2], ldwork, dummy, &dumm, &scale, 
00545                                     &work[(*n + 4) * work_dim1 + 1], &work[(*
00546                                     n + 6) * work_dim1 + 1], &ierr);
00547                         } else {
00548 
00549 /*                       Complex eigenvalue: solve */
00550 /*                       C'*(p+iq) = scale*(c+id) in real arithmetic. */
00551 
00552                             i__2 = *n - 1;
00553                             dlaqtr_(&c_true, &c_false, &i__2, &work[(
00554                                     work_dim1 << 1) + 2], ldwork, &work[(*n + 
00555                                     1) * work_dim1 + 1], &mu, &scale, &work[(*
00556                                     n + 4) * work_dim1 + 1], &work[(*n + 6) * 
00557                                     work_dim1 + 1], &ierr);
00558                         }
00559                     } else {
00560                         if (n2 == 1) {
00561 
00562 /*                       Real eigenvalue: solve C*x = scale*c. */
00563 
00564                             i__2 = *n - 1;
00565                             dlaqtr_(&c_false, &c_true, &i__2, &work[(
00566                                     work_dim1 << 1) + 2], ldwork, dummy, &
00567                                     dumm, &scale, &work[(*n + 4) * work_dim1 
00568                                     + 1], &work[(*n + 6) * work_dim1 + 1], &
00569                                     ierr);
00570                         } else {
00571 
00572 /*                       Complex eigenvalue: solve */
00573 /*                       C*(p+iq) = scale*(c+id) in real arithmetic. */
00574 
00575                             i__2 = *n - 1;
00576                             dlaqtr_(&c_false, &c_false, &i__2, &work[(
00577                                     work_dim1 << 1) + 2], ldwork, &work[(*n + 
00578                                     1) * work_dim1 + 1], &mu, &scale, &work[(*
00579                                     n + 4) * work_dim1 + 1], &work[(*n + 6) * 
00580                                     work_dim1 + 1], &ierr);
00581 
00582                         }
00583                     }
00584 
00585                     goto L50;
00586                 }
00587             }
00588 
00589             sep[ks] = scale / max(est,smlnum);
00590             if (pair) {
00591                 sep[ks + 1] = sep[ks];
00592             }
00593         }
00594 
00595         if (pair) {
00596             ++ks;
00597         }
00598 
00599 L60:
00600         ;
00601     }
00602     return 0;
00603 
00604 /*     End of DTRSNA */
00605 
00606 } /* dtrsna_ */


swiftnav
Author(s):
autogenerated on Sat Jun 8 2019 18:55:50