dlasd2.c
Go to the documentation of this file.
00001 /* dlasd2.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 doublereal c_b30 = 0.;
00020 
00021 /* Subroutine */ int dlasd2_(integer *nl, integer *nr, integer *sqre, integer 
00022         *k, doublereal *d__, doublereal *z__, doublereal *alpha, doublereal *
00023         beta, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, 
00024         doublereal *dsigma, doublereal *u2, integer *ldu2, doublereal *vt2, 
00025         integer *ldvt2, integer *idxp, integer *idx, integer *idxc, integer *
00026         idxq, integer *coltyp, integer *info)
00027 {
00028     /* System generated locals */
00029     integer u_dim1, u_offset, u2_dim1, u2_offset, vt_dim1, vt_offset, 
00030             vt2_dim1, vt2_offset, i__1;
00031     doublereal d__1, d__2;
00032 
00033     /* Local variables */
00034     doublereal c__;
00035     integer i__, j, m, n;
00036     doublereal s;
00037     integer k2;
00038     doublereal z1;
00039     integer ct, jp;
00040     doublereal eps, tau, tol;
00041     integer psm[4], nlp1, nlp2, idxi, idxj;
00042     extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, 
00043             doublereal *, integer *, doublereal *, doublereal *);
00044     integer ctot[4], idxjp;
00045     extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, 
00046             doublereal *, integer *);
00047     integer jprev;
00048     extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *);
00049     extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, 
00050             integer *, integer *, integer *), dlacpy_(char *, integer *, 
00051             integer *, doublereal *, integer *, doublereal *, integer *), dlaset_(char *, integer *, integer *, doublereal *, 
00052             doublereal *, doublereal *, integer *), xerbla_(char *, 
00053             integer *);
00054     doublereal hlftol;
00055 
00056 
00057 /*  -- LAPACK auxiliary routine (version 3.2) -- */
00058 /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
00059 /*     November 2006 */
00060 
00061 /*     .. Scalar Arguments .. */
00062 /*     .. */
00063 /*     .. Array Arguments .. */
00064 /*     .. */
00065 
00066 /*  Purpose */
00067 /*  ======= */
00068 
00069 /*  DLASD2 merges the two sets of singular values together into a single */
00070 /*  sorted set.  Then it tries to deflate the size of the problem. */
00071 /*  There are two ways in which deflation can occur:  when two or more */
00072 /*  singular values are close together or if there is a tiny entry in the */
00073 /*  Z vector.  For each such occurrence the order of the related secular */
00074 /*  equation problem is reduced by one. */
00075 
00076 /*  DLASD2 is called from DLASD1. */
00077 
00078 /*  Arguments */
00079 /*  ========= */
00080 
00081 /*  NL     (input) INTEGER */
00082 /*         The row dimension of the upper block.  NL >= 1. */
00083 
00084 /*  NR     (input) INTEGER */
00085 /*         The row dimension of the lower block.  NR >= 1. */
00086 
00087 /*  SQRE   (input) INTEGER */
00088 /*         = 0: the lower block is an NR-by-NR square matrix. */
00089 /*         = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */
00090 
00091 /*         The bidiagonal matrix has N = NL + NR + 1 rows and */
00092 /*         M = N + SQRE >= N columns. */
00093 
00094 /*  K      (output) INTEGER */
00095 /*         Contains the dimension of the non-deflated matrix, */
00096 /*         This is the order of the related secular equation. 1 <= K <=N. */
00097 
00098 /*  D      (input/output) DOUBLE PRECISION array, dimension(N) */
00099 /*         On entry D contains the singular values of the two submatrices */
00100 /*         to be combined.  On exit D contains the trailing (N-K) updated */
00101 /*         singular values (those which were deflated) sorted into */
00102 /*         increasing order. */
00103 
00104 /*  Z      (output) DOUBLE PRECISION array, dimension(N) */
00105 /*         On exit Z contains the updating row vector in the secular */
00106 /*         equation. */
00107 
00108 /*  ALPHA  (input) DOUBLE PRECISION */
00109 /*         Contains the diagonal element associated with the added row. */
00110 
00111 /*  BETA   (input) DOUBLE PRECISION */
00112 /*         Contains the off-diagonal element associated with the added */
00113 /*         row. */
00114 
00115 /*  U      (input/output) DOUBLE PRECISION array, dimension(LDU,N) */
00116 /*         On entry U contains the left singular vectors of two */
00117 /*         submatrices in the two square blocks with corners at (1,1), */
00118 /*         (NL, NL), and (NL+2, NL+2), (N,N). */
00119 /*         On exit U contains the trailing (N-K) updated left singular */
00120 /*         vectors (those which were deflated) in its last N-K columns. */
00121 
00122 /*  LDU    (input) INTEGER */
00123 /*         The leading dimension of the array U.  LDU >= N. */
00124 
00125 /*  VT     (input/output) DOUBLE PRECISION array, dimension(LDVT,M) */
00126 /*         On entry VT' contains the right singular vectors of two */
00127 /*         submatrices in the two square blocks with corners at (1,1), */
00128 /*         (NL+1, NL+1), and (NL+2, NL+2), (M,M). */
00129 /*         On exit VT' contains the trailing (N-K) updated right singular */
00130 /*         vectors (those which were deflated) in its last N-K columns. */
00131 /*         In case SQRE =1, the last row of VT spans the right null */
00132 /*         space. */
00133 
00134 /*  LDVT   (input) INTEGER */
00135 /*         The leading dimension of the array VT.  LDVT >= M. */
00136 
00137 /*  DSIGMA (output) DOUBLE PRECISION array, dimension (N) */
00138 /*         Contains a copy of the diagonal elements (K-1 singular values */
00139 /*         and one zero) in the secular equation. */
00140 
00141 /*  U2     (output) DOUBLE PRECISION array, dimension(LDU2,N) */
00142 /*         Contains a copy of the first K-1 left singular vectors which */
00143 /*         will be used by DLASD3 in a matrix multiply (DGEMM) to solve */
00144 /*         for the new left singular vectors. U2 is arranged into four */
00145 /*         blocks. The first block contains a column with 1 at NL+1 and */
00146 /*         zero everywhere else; the second block contains non-zero */
00147 /*         entries only at and above NL; the third contains non-zero */
00148 /*         entries only below NL+1; and the fourth is dense. */
00149 
00150 /*  LDU2   (input) INTEGER */
00151 /*         The leading dimension of the array U2.  LDU2 >= N. */
00152 
00153 /*  VT2    (output) DOUBLE PRECISION array, dimension(LDVT2,N) */
00154 /*         VT2' contains a copy of the first K right singular vectors */
00155 /*         which will be used by DLASD3 in a matrix multiply (DGEMM) to */
00156 /*         solve for the new right singular vectors. VT2 is arranged into */
00157 /*         three blocks. The first block contains a row that corresponds */
00158 /*         to the special 0 diagonal element in SIGMA; the second block */
00159 /*         contains non-zeros only at and before NL +1; the third block */
00160 /*         contains non-zeros only at and after  NL +2. */
00161 
00162 /*  LDVT2  (input) INTEGER */
00163 /*         The leading dimension of the array VT2.  LDVT2 >= M. */
00164 
00165 /*  IDXP   (workspace) INTEGER array dimension(N) */
00166 /*         This will contain the permutation used to place deflated */
00167 /*         values of D at the end of the array. On output IDXP(2:K) */
00168 /*         points to the nondeflated D-values and IDXP(K+1:N) */
00169 /*         points to the deflated singular values. */
00170 
00171 /*  IDX    (workspace) INTEGER array dimension(N) */
00172 /*         This will contain the permutation used to sort the contents of */
00173 /*         D into ascending order. */
00174 
00175 /*  IDXC   (output) INTEGER array dimension(N) */
00176 /*         This will contain the permutation used to arrange the columns */
00177 /*         of the deflated U matrix into three groups:  the first group */
00178 /*         contains non-zero entries only at and above NL, the second */
00179 /*         contains non-zero entries only below NL+2, and the third is */
00180 /*         dense. */
00181 
00182 /*  IDXQ   (input/output) INTEGER array dimension(N) */
00183 /*         This contains the permutation which separately sorts the two */
00184 /*         sub-problems in D into ascending order.  Note that entries in */
00185 /*         the first hlaf of this permutation must first be moved one */
00186 /*         position backward; and entries in the second half */
00187 /*         must first have NL+1 added to their values. */
00188 
00189 /*  COLTYP (workspace/output) INTEGER array dimension(N) */
00190 /*         As workspace, this will contain a label which will indicate */
00191 /*         which of the following types a column in the U2 matrix or a */
00192 /*         row in the VT2 matrix is: */
00193 /*         1 : non-zero in the upper half only */
00194 /*         2 : non-zero in the lower half only */
00195 /*         3 : dense */
00196 /*         4 : deflated */
00197 
00198 /*         On exit, it is an array of dimension 4, with COLTYP(I) being */
00199 /*         the dimension of the I-th type columns. */
00200 
00201 /*  INFO   (output) INTEGER */
00202 /*          = 0:  successful exit. */
00203 /*          < 0:  if INFO = -i, the i-th argument had an illegal value. */
00204 
00205 /*  Further Details */
00206 /*  =============== */
00207 
00208 /*  Based on contributions by */
00209 /*     Ming Gu and Huan Ren, Computer Science Division, University of */
00210 /*     California at Berkeley, USA */
00211 
00212 /*  ===================================================================== */
00213 
00214 /*     .. Parameters .. */
00215 /*     .. */
00216 /*     .. Local Arrays .. */
00217 /*     .. */
00218 /*     .. Local Scalars .. */
00219 /*     .. */
00220 /*     .. External Functions .. */
00221 /*     .. */
00222 /*     .. External Subroutines .. */
00223 /*     .. */
00224 /*     .. Intrinsic Functions .. */
00225 /*     .. */
00226 /*     .. Executable Statements .. */
00227 
00228 /*     Test the input parameters. */
00229 
00230     /* Parameter adjustments */
00231     --d__;
00232     --z__;
00233     u_dim1 = *ldu;
00234     u_offset = 1 + u_dim1;
00235     u -= u_offset;
00236     vt_dim1 = *ldvt;
00237     vt_offset = 1 + vt_dim1;
00238     vt -= vt_offset;
00239     --dsigma;
00240     u2_dim1 = *ldu2;
00241     u2_offset = 1 + u2_dim1;
00242     u2 -= u2_offset;
00243     vt2_dim1 = *ldvt2;
00244     vt2_offset = 1 + vt2_dim1;
00245     vt2 -= vt2_offset;
00246     --idxp;
00247     --idx;
00248     --idxc;
00249     --idxq;
00250     --coltyp;
00251 
00252     /* Function Body */
00253     *info = 0;
00254 
00255     if (*nl < 1) {
00256         *info = -1;
00257     } else if (*nr < 1) {
00258         *info = -2;
00259     } else if (*sqre != 1 && *sqre != 0) {
00260         *info = -3;
00261     }
00262 
00263     n = *nl + *nr + 1;
00264     m = n + *sqre;
00265 
00266     if (*ldu < n) {
00267         *info = -10;
00268     } else if (*ldvt < m) {
00269         *info = -12;
00270     } else if (*ldu2 < n) {
00271         *info = -15;
00272     } else if (*ldvt2 < m) {
00273         *info = -17;
00274     }
00275     if (*info != 0) {
00276         i__1 = -(*info);
00277         xerbla_("DLASD2", &i__1);
00278         return 0;
00279     }
00280 
00281     nlp1 = *nl + 1;
00282     nlp2 = *nl + 2;
00283 
00284 /*     Generate the first part of the vector Z; and move the singular */
00285 /*     values in the first part of D one position backward. */
00286 
00287     z1 = *alpha * vt[nlp1 + nlp1 * vt_dim1];
00288     z__[1] = z1;
00289     for (i__ = *nl; i__ >= 1; --i__) {
00290         z__[i__ + 1] = *alpha * vt[i__ + nlp1 * vt_dim1];
00291         d__[i__ + 1] = d__[i__];
00292         idxq[i__ + 1] = idxq[i__] + 1;
00293 /* L10: */
00294     }
00295 
00296 /*     Generate the second part of the vector Z. */
00297 
00298     i__1 = m;
00299     for (i__ = nlp2; i__ <= i__1; ++i__) {
00300         z__[i__] = *beta * vt[i__ + nlp2 * vt_dim1];
00301 /* L20: */
00302     }
00303 
00304 /*     Initialize some reference arrays. */
00305 
00306     i__1 = nlp1;
00307     for (i__ = 2; i__ <= i__1; ++i__) {
00308         coltyp[i__] = 1;
00309 /* L30: */
00310     }
00311     i__1 = n;
00312     for (i__ = nlp2; i__ <= i__1; ++i__) {
00313         coltyp[i__] = 2;
00314 /* L40: */
00315     }
00316 
00317 /*     Sort the singular values into increasing order */
00318 
00319     i__1 = n;
00320     for (i__ = nlp2; i__ <= i__1; ++i__) {
00321         idxq[i__] += nlp1;
00322 /* L50: */
00323     }
00324 
00325 /*     DSIGMA, IDXC, IDXC, and the first column of U2 */
00326 /*     are used as storage space. */
00327 
00328     i__1 = n;
00329     for (i__ = 2; i__ <= i__1; ++i__) {
00330         dsigma[i__] = d__[idxq[i__]];
00331         u2[i__ + u2_dim1] = z__[idxq[i__]];
00332         idxc[i__] = coltyp[idxq[i__]];
00333 /* L60: */
00334     }
00335 
00336     dlamrg_(nl, nr, &dsigma[2], &c__1, &c__1, &idx[2]);
00337 
00338     i__1 = n;
00339     for (i__ = 2; i__ <= i__1; ++i__) {
00340         idxi = idx[i__] + 1;
00341         d__[i__] = dsigma[idxi];
00342         z__[i__] = u2[idxi + u2_dim1];
00343         coltyp[i__] = idxc[idxi];
00344 /* L70: */
00345     }
00346 
00347 /*     Calculate the allowable deflation tolerance */
00348 
00349     eps = dlamch_("Epsilon");
00350 /* Computing MAX */
00351     d__1 = abs(*alpha), d__2 = abs(*beta);
00352     tol = max(d__1,d__2);
00353 /* Computing MAX */
00354     d__2 = (d__1 = d__[n], abs(d__1));
00355     tol = eps * 8. * max(d__2,tol);
00356 
00357 /*     There are 2 kinds of deflation -- first a value in the z-vector */
00358 /*     is small, second two (or more) singular values are very close */
00359 /*     together (their difference is small). */
00360 
00361 /*     If the value in the z-vector is small, we simply permute the */
00362 /*     array so that the corresponding singular value is moved to the */
00363 /*     end. */
00364 
00365 /*     If two values in the D-vector are close, we perform a two-sided */
00366 /*     rotation designed to make one of the corresponding z-vector */
00367 /*     entries zero, and then permute the array so that the deflated */
00368 /*     singular value is moved to the end. */
00369 
00370 /*     If there are multiple singular values then the problem deflates. */
00371 /*     Here the number of equal singular values are found.  As each equal */
00372 /*     singular value is found, an elementary reflector is computed to */
00373 /*     rotate the corresponding singular subspace so that the */
00374 /*     corresponding components of Z are zero in this new basis. */
00375 
00376     *k = 1;
00377     k2 = n + 1;
00378     i__1 = n;
00379     for (j = 2; j <= i__1; ++j) {
00380         if ((d__1 = z__[j], abs(d__1)) <= tol) {
00381 
00382 /*           Deflate due to small z component. */
00383 
00384             --k2;
00385             idxp[k2] = j;
00386             coltyp[j] = 4;
00387             if (j == n) {
00388                 goto L120;
00389             }
00390         } else {
00391             jprev = j;
00392             goto L90;
00393         }
00394 /* L80: */
00395     }
00396 L90:
00397     j = jprev;
00398 L100:
00399     ++j;
00400     if (j > n) {
00401         goto L110;
00402     }
00403     if ((d__1 = z__[j], abs(d__1)) <= tol) {
00404 
00405 /*        Deflate due to small z component. */
00406 
00407         --k2;
00408         idxp[k2] = j;
00409         coltyp[j] = 4;
00410     } else {
00411 
00412 /*        Check if singular values are close enough to allow deflation. */
00413 
00414         if ((d__1 = d__[j] - d__[jprev], abs(d__1)) <= tol) {
00415 
00416 /*           Deflation is possible. */
00417 
00418             s = z__[jprev];
00419             c__ = z__[j];
00420 
00421 /*           Find sqrt(a**2+b**2) without overflow or */
00422 /*           destructive underflow. */
00423 
00424             tau = dlapy2_(&c__, &s);
00425             c__ /= tau;
00426             s = -s / tau;
00427             z__[j] = tau;
00428             z__[jprev] = 0.;
00429 
00430 /*           Apply back the Givens rotation to the left and right */
00431 /*           singular vector matrices. */
00432 
00433             idxjp = idxq[idx[jprev] + 1];
00434             idxj = idxq[idx[j] + 1];
00435             if (idxjp <= nlp1) {
00436                 --idxjp;
00437             }
00438             if (idxj <= nlp1) {
00439                 --idxj;
00440             }
00441             drot_(&n, &u[idxjp * u_dim1 + 1], &c__1, &u[idxj * u_dim1 + 1], &
00442                     c__1, &c__, &s);
00443             drot_(&m, &vt[idxjp + vt_dim1], ldvt, &vt[idxj + vt_dim1], ldvt, &
00444                     c__, &s);
00445             if (coltyp[j] != coltyp[jprev]) {
00446                 coltyp[j] = 3;
00447             }
00448             coltyp[jprev] = 4;
00449             --k2;
00450             idxp[k2] = jprev;
00451             jprev = j;
00452         } else {
00453             ++(*k);
00454             u2[*k + u2_dim1] = z__[jprev];
00455             dsigma[*k] = d__[jprev];
00456             idxp[*k] = jprev;
00457             jprev = j;
00458         }
00459     }
00460     goto L100;
00461 L110:
00462 
00463 /*     Record the last singular value. */
00464 
00465     ++(*k);
00466     u2[*k + u2_dim1] = z__[jprev];
00467     dsigma[*k] = d__[jprev];
00468     idxp[*k] = jprev;
00469 
00470 L120:
00471 
00472 /*     Count up the total number of the various types of columns, then */
00473 /*     form a permutation which positions the four column types into */
00474 /*     four groups of uniform structure (although one or more of these */
00475 /*     groups may be empty). */
00476 
00477     for (j = 1; j <= 4; ++j) {
00478         ctot[j - 1] = 0;
00479 /* L130: */
00480     }
00481     i__1 = n;
00482     for (j = 2; j <= i__1; ++j) {
00483         ct = coltyp[j];
00484         ++ctot[ct - 1];
00485 /* L140: */
00486     }
00487 
00488 /*     PSM(*) = Position in SubMatrix (of types 1 through 4) */
00489 
00490     psm[0] = 2;
00491     psm[1] = ctot[0] + 2;
00492     psm[2] = psm[1] + ctot[1];
00493     psm[3] = psm[2] + ctot[2];
00494 
00495 /*     Fill out the IDXC array so that the permutation which it induces */
00496 /*     will place all type-1 columns first, all type-2 columns next, */
00497 /*     then all type-3's, and finally all type-4's, starting from the */
00498 /*     second column. This applies similarly to the rows of VT. */
00499 
00500     i__1 = n;
00501     for (j = 2; j <= i__1; ++j) {
00502         jp = idxp[j];
00503         ct = coltyp[jp];
00504         idxc[psm[ct - 1]] = j;
00505         ++psm[ct - 1];
00506 /* L150: */
00507     }
00508 
00509 /*     Sort the singular values and corresponding singular vectors into */
00510 /*     DSIGMA, U2, and VT2 respectively.  The singular values/vectors */
00511 /*     which were not deflated go into the first K slots of DSIGMA, U2, */
00512 /*     and VT2 respectively, while those which were deflated go into the */
00513 /*     last N - K slots, except that the first column/row will be treated */
00514 /*     separately. */
00515 
00516     i__1 = n;
00517     for (j = 2; j <= i__1; ++j) {
00518         jp = idxp[j];
00519         dsigma[j] = d__[jp];
00520         idxj = idxq[idx[idxp[idxc[j]]] + 1];
00521         if (idxj <= nlp1) {
00522             --idxj;
00523         }
00524         dcopy_(&n, &u[idxj * u_dim1 + 1], &c__1, &u2[j * u2_dim1 + 1], &c__1);
00525         dcopy_(&m, &vt[idxj + vt_dim1], ldvt, &vt2[j + vt2_dim1], ldvt2);
00526 /* L160: */
00527     }
00528 
00529 /*     Determine DSIGMA(1), DSIGMA(2) and Z(1) */
00530 
00531     dsigma[1] = 0.;
00532     hlftol = tol / 2.;
00533     if (abs(dsigma[2]) <= hlftol) {
00534         dsigma[2] = hlftol;
00535     }
00536     if (m > n) {
00537         z__[1] = dlapy2_(&z1, &z__[m]);
00538         if (z__[1] <= tol) {
00539             c__ = 1.;
00540             s = 0.;
00541             z__[1] = tol;
00542         } else {
00543             c__ = z1 / z__[1];
00544             s = z__[m] / z__[1];
00545         }
00546     } else {
00547         if (abs(z1) <= tol) {
00548             z__[1] = tol;
00549         } else {
00550             z__[1] = z1;
00551         }
00552     }
00553 
00554 /*     Move the rest of the updating row to Z. */
00555 
00556     i__1 = *k - 1;
00557     dcopy_(&i__1, &u2[u2_dim1 + 2], &c__1, &z__[2], &c__1);
00558 
00559 /*     Determine the first column of U2, the first row of VT2 and the */
00560 /*     last row of VT. */
00561 
00562     dlaset_("A", &n, &c__1, &c_b30, &c_b30, &u2[u2_offset], ldu2);
00563     u2[nlp1 + u2_dim1] = 1.;
00564     if (m > n) {
00565         i__1 = nlp1;
00566         for (i__ = 1; i__ <= i__1; ++i__) {
00567             vt[m + i__ * vt_dim1] = -s * vt[nlp1 + i__ * vt_dim1];
00568             vt2[i__ * vt2_dim1 + 1] = c__ * vt[nlp1 + i__ * vt_dim1];
00569 /* L170: */
00570         }
00571         i__1 = m;
00572         for (i__ = nlp2; i__ <= i__1; ++i__) {
00573             vt2[i__ * vt2_dim1 + 1] = s * vt[m + i__ * vt_dim1];
00574             vt[m + i__ * vt_dim1] = c__ * vt[m + i__ * vt_dim1];
00575 /* L180: */
00576         }
00577     } else {
00578         dcopy_(&m, &vt[nlp1 + vt_dim1], ldvt, &vt2[vt2_dim1 + 1], ldvt2);
00579     }
00580     if (m > n) {
00581         dcopy_(&m, &vt[m + vt_dim1], ldvt, &vt2[m + vt2_dim1], ldvt2);
00582     }
00583 
00584 /*     The deflated singular values and their corresponding vectors go */
00585 /*     into the back of D, U, and V respectively. */
00586 
00587     if (n > *k) {
00588         i__1 = n - *k;
00589         dcopy_(&i__1, &dsigma[*k + 1], &c__1, &d__[*k + 1], &c__1);
00590         i__1 = n - *k;
00591         dlacpy_("A", &n, &i__1, &u2[(*k + 1) * u2_dim1 + 1], ldu2, &u[(*k + 1)
00592                  * u_dim1 + 1], ldu);
00593         i__1 = n - *k;
00594         dlacpy_("A", &i__1, &m, &vt2[*k + 1 + vt2_dim1], ldvt2, &vt[*k + 1 + 
00595                 vt_dim1], ldvt);
00596     }
00597 
00598 /*     Copy CTOT into COLTYP for referencing in DLASD3. */
00599 
00600     for (j = 1; j <= 4; ++j) {
00601         coltyp[j] = ctot[j - 1];
00602 /* L190: */
00603     }
00604 
00605     return 0;
00606 
00607 /*     End of DLASD2 */
00608 
00609 } /* dlasd2_ */


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