14 typedef long long BLASLONG;
15 typedef unsigned long long BLASULONG;
17 typedef long BLASLONG;
18 typedef unsigned long BLASULONG;
22 typedef BLASLONG blasint;
24 #define blasabs(x) llabs(x)
26 #define blasabs(x) labs(x)
30 #define blasabs(x) abs(x)
33 typedef blasint integer;
35 typedef unsigned int uinteger;
36 typedef char *address;
37 typedef short int shortint;
39 typedef double doublereal;
40 typedef struct { real r, i; } complex;
41 typedef struct { doublereal r, i; } doublecomplex;
43 static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;}
44 static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;}
45 static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;}
46 static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;}
48 static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;}
49 static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;}
50 static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;}
51 static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;}
53 #define pCf(z) (*_pCf(z))
54 #define pCd(z) (*_pCd(z))
56 typedef short int shortlogical;
57 typedef char logical1;
58 typedef char integer1;
63 /* Extern is for use with -E */
74 /*external read, write*/
83 /*internal read, write*/
113 /*rewind, backspace, endfile*/
125 ftnint *inex; /*parameters in standard's order*/
151 union Multitype { /* for multiple entry points */
162 typedef union Multitype Multitype;
164 struct Vardesc { /* for Namelist */
170 typedef struct Vardesc Vardesc;
177 typedef struct Namelist Namelist;
179 #define abs(x) ((x) >= 0 ? (x) : -(x))
180 #define dabs(x) (fabs(x))
181 #define f2cmin(a,b) ((a) <= (b) ? (a) : (b))
182 #define f2cmax(a,b) ((a) >= (b) ? (a) : (b))
183 #define dmin(a,b) (f2cmin(a,b))
184 #define dmax(a,b) (f2cmax(a,b))
185 #define bit_test(a,b) ((a) >> (b) & 1)
186 #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b)))
187 #define bit_set(a,b) ((a) | ((uinteger)1 << (b)))
189 #define abort_() { sig_die("Fortran abort routine called", 1); }
190 #define c_abs(z) (cabsf(Cf(z)))
191 #define c_cos(R,Z) { pCf(R)=ccos(Cf(Z)); }
193 #define c_div(c, a, b) {Cf(c)._Val[0] = (Cf(a)._Val[0]/Cf(b)._Val[0]); Cf(c)._Val[1]=(Cf(a)._Val[1]/Cf(b)._Val[1]);}
194 #define z_div(c, a, b) {Cd(c)._Val[0] = (Cd(a)._Val[0]/Cd(b)._Val[0]); Cd(c)._Val[1]=(Cd(a)._Val[1]/df(b)._Val[1]);}
196 #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);}
197 #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);}
199 #define c_exp(R, Z) {pCf(R) = cexpf(Cf(Z));}
200 #define c_log(R, Z) {pCf(R) = clogf(Cf(Z));}
201 #define c_sin(R, Z) {pCf(R) = csinf(Cf(Z));}
202 //#define c_sqrt(R, Z) {*(R) = csqrtf(Cf(Z));}
203 #define c_sqrt(R, Z) {pCf(R) = csqrtf(Cf(Z));}
204 #define d_abs(x) (fabs(*(x)))
205 #define d_acos(x) (acos(*(x)))
206 #define d_asin(x) (asin(*(x)))
207 #define d_atan(x) (atan(*(x)))
208 #define d_atn2(x, y) (atan2(*(x),*(y)))
209 #define d_cnjg(R, Z) { pCd(R) = conj(Cd(Z)); }
210 #define r_cnjg(R, Z) { pCf(R) = conjf(Cf(Z)); }
211 #define d_cos(x) (cos(*(x)))
212 #define d_cosh(x) (cosh(*(x)))
213 #define d_dim(__a, __b) ( *(__a) > *(__b) ? *(__a) - *(__b) : 0.0 )
214 #define d_exp(x) (exp(*(x)))
215 #define d_imag(z) (cimag(Cd(z)))
216 #define r_imag(z) (cimagf(Cf(z)))
217 #define d_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x)))
218 #define r_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x)))
219 #define d_lg10(x) ( 0.43429448190325182765 * log(*(x)) )
220 #define r_lg10(x) ( 0.43429448190325182765 * log(*(x)) )
221 #define d_log(x) (log(*(x)))
222 #define d_mod(x, y) (fmod(*(x), *(y)))
223 #define u_nint(__x) ((__x)>=0 ? floor((__x) + .5) : -floor(.5 - (__x)))
224 #define d_nint(x) u_nint(*(x))
225 #define u_sign(__a,__b) ((__b) >= 0 ? ((__a) >= 0 ? (__a) : -(__a)) : -((__a) >= 0 ? (__a) : -(__a)))
226 #define d_sign(a,b) u_sign(*(a),*(b))
227 #define r_sign(a,b) u_sign(*(a),*(b))
228 #define d_sin(x) (sin(*(x)))
229 #define d_sinh(x) (sinh(*(x)))
230 #define d_sqrt(x) (sqrt(*(x)))
231 #define d_tan(x) (tan(*(x)))
232 #define d_tanh(x) (tanh(*(x)))
233 #define i_abs(x) abs(*(x))
234 #define i_dnnt(x) ((integer)u_nint(*(x)))
235 #define i_len(s, n) (n)
236 #define i_nint(x) ((integer)u_nint(*(x)))
237 #define i_sign(a,b) ((integer)u_sign((integer)*(a),(integer)*(b)))
238 #define pow_dd(ap, bp) ( pow(*(ap), *(bp)))
239 #define pow_si(B,E) spow_ui(*(B),*(E))
240 #define pow_ri(B,E) spow_ui(*(B),*(E))
241 #define pow_di(B,E) dpow_ui(*(B),*(E))
242 #define pow_zi(p, a, b) {pCd(p) = zpow_ui(Cd(a), *(b));}
243 #define pow_ci(p, a, b) {pCf(p) = cpow_ui(Cf(a), *(b));}
244 #define pow_zz(R,A,B) {pCd(R) = cpow(Cd(A),*(B));}
245 #define s_cat(lpp, rpp, rnp, np, llp) { ftnlen i, nc, ll; char *f__rp, *lp; ll = (llp); lp = (lpp); for(i=0; i < (int)*(np); ++i) { nc = ll; if((rnp)[i] < nc) nc = (rnp)[i]; ll -= nc; f__rp = (rpp)[i]; while(--nc >= 0) *lp++ = *(f__rp)++; } while(--ll >= 0) *lp++ = ' '; }
246 #define s_cmp(a,b,c,d) ((integer)strncmp((a),(b),f2cmin((c),(d))))
247 #define s_copy(A,B,C,D) { int __i,__m; for (__i=0, __m=f2cmin((C),(D)); __i<__m && (B)[__i] != 0; ++__i) (A)[__i] = (B)[__i]; }
248 #define sig_die(s, kill) { exit(1); }
249 #define s_stop(s, n) {exit(0);}
250 static char junk[] = "\n@(#)LIBF77 VERSION 19990503\n";
251 #define z_abs(z) (cabs(Cd(z)))
252 #define z_exp(R, Z) {pCd(R) = cexp(Cd(Z));}
253 #define z_sqrt(R, Z) {pCd(R) = csqrt(Cd(Z));}
254 #define myexit_() break;
255 #define mycycle() continue;
256 #define myceiling(w) {ceil(w)}
257 #define myhuge(w) {HUGE_VAL}
258 //#define mymaxloc_(w,s,e,n) {if (sizeof(*(w)) == sizeof(double)) dmaxloc_((w),*(s),*(e),n); else dmaxloc_((w),*(s),*(e),n);}
259 #define mymaxloc(w,s,e,n) {dmaxloc_(w,*(s),*(e),n)}
261 /* procedure parameter types for -A and -C++ */
263 #define F2C_proc_par_types 1
265 typedef logical (*L_fp)(...);
267 typedef logical (*L_fp)();
270 static float spow_ui(float x, integer n) {
271 float pow=1.0; unsigned long int u;
273 if(n < 0) n = -n, x = 1/x;
282 static double dpow_ui(double x, integer n) {
283 double pow=1.0; unsigned long int u;
285 if(n < 0) n = -n, x = 1/x;
295 static _Fcomplex cpow_ui(complex x, integer n) {
296 complex pow={1.0,0.0}; unsigned long int u;
298 if(n < 0) n = -n, x.r = 1/x.r, x.i=1/x.i;
300 if(u & 01) pow.r *= x.r, pow.i *= x.i;
301 if(u >>= 1) x.r *= x.r, x.i *= x.i;
305 _Fcomplex p={pow.r, pow.i};
309 static _Complex float cpow_ui(_Complex float x, integer n) {
310 _Complex float pow=1.0; unsigned long int u;
312 if(n < 0) n = -n, x = 1/x;
323 static _Dcomplex zpow_ui(_Dcomplex x, integer n) {
324 _Dcomplex pow={1.0,0.0}; unsigned long int u;
326 if(n < 0) n = -n, x._Val[0] = 1/x._Val[0], x._Val[1] =1/x._Val[1];
328 if(u & 01) pow._Val[0] *= x._Val[0], pow._Val[1] *= x._Val[1];
329 if(u >>= 1) x._Val[0] *= x._Val[0], x._Val[1] *= x._Val[1];
333 _Dcomplex p = {pow._Val[0], pow._Val[1]};
337 static _Complex double zpow_ui(_Complex double x, integer n) {
338 _Complex double pow=1.0; unsigned long int u;
340 if(n < 0) n = -n, x = 1/x;
350 static integer pow_ii(integer x, integer n) {
351 integer pow; unsigned long int u;
353 if (n == 0 || x == 1) pow = 1;
354 else if (x != -1) pow = x == 0 ? 1/x : 0;
357 if ((n > 0) || !(n == 0 || x == 1 || x != -1)) {
367 static integer dmaxloc_(double *w, integer s, integer e, integer *n)
369 double m; integer i, mi;
370 for(m=w[s-1], mi=s, i=s+1; i<=e; i++)
371 if (w[i-1]>m) mi=i ,m=w[i-1];
374 static integer smaxloc_(float *w, integer s, integer e, integer *n)
376 float m; integer i, mi;
377 for(m=w[s-1], mi=s, i=s+1; i<=e; i++)
378 if (w[i-1]>m) mi=i ,m=w[i-1];
381 static inline void cdotc_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) {
382 integer n = *n_, incx = *incx_, incy = *incy_, i;
384 _Fcomplex zdotc = {0.0, 0.0};
385 if (incx == 1 && incy == 1) {
386 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
387 zdotc._Val[0] += conjf(Cf(&x[i]))._Val[0] * Cf(&y[i])._Val[0];
388 zdotc._Val[1] += conjf(Cf(&x[i]))._Val[1] * Cf(&y[i])._Val[1];
391 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
392 zdotc._Val[0] += conjf(Cf(&x[i*incx]))._Val[0] * Cf(&y[i*incy])._Val[0];
393 zdotc._Val[1] += conjf(Cf(&x[i*incx]))._Val[1] * Cf(&y[i*incy])._Val[1];
399 _Complex float zdotc = 0.0;
400 if (incx == 1 && incy == 1) {
401 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
402 zdotc += conjf(Cf(&x[i])) * Cf(&y[i]);
405 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
406 zdotc += conjf(Cf(&x[i*incx])) * Cf(&y[i*incy]);
412 static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) {
413 integer n = *n_, incx = *incx_, incy = *incy_, i;
415 _Dcomplex zdotc = {0.0, 0.0};
416 if (incx == 1 && incy == 1) {
417 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
418 zdotc._Val[0] += conj(Cd(&x[i]))._Val[0] * Cd(&y[i])._Val[0];
419 zdotc._Val[1] += conj(Cd(&x[i]))._Val[1] * Cd(&y[i])._Val[1];
422 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
423 zdotc._Val[0] += conj(Cd(&x[i*incx]))._Val[0] * Cd(&y[i*incy])._Val[0];
424 zdotc._Val[1] += conj(Cd(&x[i*incx]))._Val[1] * Cd(&y[i*incy])._Val[1];
430 _Complex double zdotc = 0.0;
431 if (incx == 1 && incy == 1) {
432 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
433 zdotc += conj(Cd(&x[i])) * Cd(&y[i]);
436 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
437 zdotc += conj(Cd(&x[i*incx])) * Cd(&y[i*incy]);
443 static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) {
444 integer n = *n_, incx = *incx_, incy = *incy_, i;
446 _Fcomplex zdotc = {0.0, 0.0};
447 if (incx == 1 && incy == 1) {
448 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
449 zdotc._Val[0] += Cf(&x[i])._Val[0] * Cf(&y[i])._Val[0];
450 zdotc._Val[1] += Cf(&x[i])._Val[1] * Cf(&y[i])._Val[1];
453 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
454 zdotc._Val[0] += Cf(&x[i*incx])._Val[0] * Cf(&y[i*incy])._Val[0];
455 zdotc._Val[1] += Cf(&x[i*incx])._Val[1] * Cf(&y[i*incy])._Val[1];
461 _Complex float zdotc = 0.0;
462 if (incx == 1 && incy == 1) {
463 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
464 zdotc += Cf(&x[i]) * Cf(&y[i]);
467 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
468 zdotc += Cf(&x[i*incx]) * Cf(&y[i*incy]);
474 static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) {
475 integer n = *n_, incx = *incx_, incy = *incy_, i;
477 _Dcomplex zdotc = {0.0, 0.0};
478 if (incx == 1 && incy == 1) {
479 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
480 zdotc._Val[0] += Cd(&x[i])._Val[0] * Cd(&y[i])._Val[0];
481 zdotc._Val[1] += Cd(&x[i])._Val[1] * Cd(&y[i])._Val[1];
484 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
485 zdotc._Val[0] += Cd(&x[i*incx])._Val[0] * Cd(&y[i*incy])._Val[0];
486 zdotc._Val[1] += Cd(&x[i*incx])._Val[1] * Cd(&y[i*incy])._Val[1];
492 _Complex double zdotc = 0.0;
493 if (incx == 1 && incy == 1) {
494 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
495 zdotc += Cd(&x[i]) * Cd(&y[i]);
498 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
499 zdotc += Cd(&x[i*incx]) * Cd(&y[i*incy]);
505 /* -- translated by f2c (version 20000121).
506 You must link the resulting object file with the libraries:
507 -lf2c -lm (in that order)
513 /* Table of constant values */
515 static integer c__6 = 6;
516 static integer c__0 = 0;
517 static integer c__2 = 2;
518 static integer c_n1 = -1;
519 static doublereal c_b57 = 0.;
520 static integer c__1 = 1;
521 static doublereal c_b79 = 1.;
523 /* > \brief <b> DGESVD computes the singular value decomposition (SVD) for GE matrices</b> */
525 /* =========== DOCUMENTATION =========== */
527 /* Online html documentation available at */
528 /* http://www.netlib.org/lapack/explore-html/ */
531 /* > Download DGESVD + dependencies */
532 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dgesvd.
535 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dgesvd.
538 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dgesvd.
546 /* SUBROUTINE DGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT, */
547 /* WORK, LWORK, INFO ) */
549 /* CHARACTER JOBU, JOBVT */
550 /* INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N */
551 /* DOUBLE PRECISION A( LDA, * ), S( * ), U( LDU, * ), */
552 /* $ VT( LDVT, * ), WORK( * ) */
555 /* > \par Purpose: */
560 /* > DGESVD computes the singular value decomposition (SVD) of a real */
561 /* > M-by-N matrix A, optionally computing the left and/or right singular */
562 /* > vectors. The SVD is written */
564 /* > A = U * SIGMA * transpose(V) */
566 /* > where SIGMA is an M-by-N matrix which is zero except for its */
567 /* > f2cmin(m,n) diagonal elements, U is an M-by-M orthogonal matrix, and */
568 /* > V is an N-by-N orthogonal matrix. The diagonal elements of SIGMA */
569 /* > are the singular values of A; they are real and non-negative, and */
570 /* > are returned in descending order. The first f2cmin(m,n) columns of */
571 /* > U and V are the left and right singular vectors of A. */
573 /* > Note that the routine returns V**T, not V. */
579 /* > \param[in] JOBU */
581 /* > JOBU is CHARACTER*1 */
582 /* > Specifies options for computing all or part of the matrix U: */
583 /* > = 'A': all M columns of U are returned in array U: */
584 /* > = 'S': the first f2cmin(m,n) columns of U (the left singular */
585 /* > vectors) are returned in the array U; */
586 /* > = 'O': the first f2cmin(m,n) columns of U (the left singular */
587 /* > vectors) are overwritten on the array A; */
588 /* > = 'N': no columns of U (no left singular vectors) are */
592 /* > \param[in] JOBVT */
594 /* > JOBVT is CHARACTER*1 */
595 /* > Specifies options for computing all or part of the matrix */
597 /* > = 'A': all N rows of V**T are returned in the array VT; */
598 /* > = 'S': the first f2cmin(m,n) rows of V**T (the right singular */
599 /* > vectors) are returned in the array VT; */
600 /* > = 'O': the first f2cmin(m,n) rows of V**T (the right singular */
601 /* > vectors) are overwritten on the array A; */
602 /* > = 'N': no rows of V**T (no right singular vectors) are */
605 /* > JOBVT and JOBU cannot both be 'O'. */
611 /* > The number of rows of the input matrix A. M >= 0. */
617 /* > The number of columns of the input matrix A. N >= 0. */
620 /* > \param[in,out] A */
622 /* > A is DOUBLE PRECISION array, dimension (LDA,N) */
623 /* > On entry, the M-by-N matrix A. */
625 /* > if JOBU = 'O', A is overwritten with the first f2cmin(m,n) */
626 /* > columns of U (the left singular vectors, */
627 /* > stored columnwise); */
628 /* > if JOBVT = 'O', A is overwritten with the first f2cmin(m,n) */
629 /* > rows of V**T (the right singular vectors, */
630 /* > stored rowwise); */
631 /* > if JOBU .ne. 'O' and JOBVT .ne. 'O', the contents of A */
632 /* > are destroyed. */
635 /* > \param[in] LDA */
637 /* > LDA is INTEGER */
638 /* > The leading dimension of the array A. LDA >= f2cmax(1,M). */
641 /* > \param[out] S */
643 /* > S is DOUBLE PRECISION array, dimension (f2cmin(M,N)) */
644 /* > The singular values of A, sorted so that S(i) >= S(i+1). */
647 /* > \param[out] U */
649 /* > U is DOUBLE PRECISION array, dimension (LDU,UCOL) */
650 /* > (LDU,M) if JOBU = 'A' or (LDU,f2cmin(M,N)) if JOBU = 'S'. */
651 /* > If JOBU = 'A', U contains the M-by-M orthogonal matrix U; */
652 /* > if JOBU = 'S', U contains the first f2cmin(m,n) columns of U */
653 /* > (the left singular vectors, stored columnwise); */
654 /* > if JOBU = 'N' or 'O', U is not referenced. */
657 /* > \param[in] LDU */
659 /* > LDU is INTEGER */
660 /* > The leading dimension of the array U. LDU >= 1; if */
661 /* > JOBU = 'S' or 'A', LDU >= M. */
664 /* > \param[out] VT */
666 /* > VT is DOUBLE PRECISION array, dimension (LDVT,N) */
667 /* > If JOBVT = 'A', VT contains the N-by-N orthogonal matrix */
669 /* > if JOBVT = 'S', VT contains the first f2cmin(m,n) rows of */
670 /* > V**T (the right singular vectors, stored rowwise); */
671 /* > if JOBVT = 'N' or 'O', VT is not referenced. */
674 /* > \param[in] LDVT */
676 /* > LDVT is INTEGER */
677 /* > The leading dimension of the array VT. LDVT >= 1; if */
678 /* > JOBVT = 'A', LDVT >= N; if JOBVT = 'S', LDVT >= f2cmin(M,N). */
681 /* > \param[out] WORK */
683 /* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */
684 /* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK; */
685 /* > if INFO > 0, WORK(2:MIN(M,N)) contains the unconverged */
686 /* > superdiagonal elements of an upper bidiagonal matrix B */
687 /* > whose diagonal is in S (not necessarily sorted). B */
688 /* > satisfies A = U * B * VT, so it has the same singular values */
689 /* > as A, and singular vectors related by U and VT. */
692 /* > \param[in] LWORK */
694 /* > LWORK is INTEGER */
695 /* > The dimension of the array WORK. */
696 /* > LWORK >= MAX(1,5*MIN(M,N)) for the paths (see comments inside code): */
697 /* > - PATH 1 (M much larger than N, JOBU='N') */
698 /* > - PATH 1t (N much larger than M, JOBVT='N') */
699 /* > LWORK >= MAX(1,3*MIN(M,N) + MAX(M,N),5*MIN(M,N)) for the other paths */
700 /* > For good performance, LWORK should generally be larger. */
702 /* > If LWORK = -1, then a workspace query is assumed; the routine */
703 /* > only calculates the optimal size of the WORK array, returns */
704 /* > this value as the first entry of the WORK array, and no error */
705 /* > message related to LWORK is issued by XERBLA. */
708 /* > \param[out] INFO */
710 /* > INFO is INTEGER */
711 /* > = 0: successful exit. */
712 /* > < 0: if INFO = -i, the i-th argument had an illegal value. */
713 /* > > 0: if DBDSQR did not converge, INFO specifies how many */
714 /* > superdiagonals of an intermediate bidiagonal form B */
715 /* > did not converge to zero. See the description of WORK */
716 /* > above for details. */
722 /* > \author Univ. of Tennessee */
723 /* > \author Univ. of California Berkeley */
724 /* > \author Univ. of Colorado Denver */
725 /* > \author NAG Ltd. */
727 /* > \date April 2012 */
729 /* > \ingroup doubleGEsing */
731 /* ===================================================================== */
732 /* Subroutine */ int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n,
733 doublereal *a, integer *lda, doublereal *s, doublereal *u, integer *
734 ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork,
737 /* System generated locals */
739 integer a_dim1, a_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1[2],
743 /* Local variables */
746 integer ierr, itau, ncvt, nrvt, lwork_dgebrd__, lwork_dgelqf__,
748 extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *,
749 integer *, doublereal *, doublereal *, integer *, doublereal *,
750 integer *, doublereal *, doublereal *, integer *);
751 extern logical lsame_(char *, char *);
752 integer chunk, minmn, wrkbl, itaup, itauq, mnthr, iwork;
753 logical wntua, wntva, wntun, wntuo, wntvn, wntvo, wntus, wntvs;
755 extern /* Subroutine */ int dgebrd_(integer *, integer *, doublereal *,
756 integer *, doublereal *, doublereal *, doublereal *, doublereal *,
757 doublereal *, integer *, integer *);
758 extern doublereal dlamch_(char *), dlange_(char *, integer *,
759 integer *, doublereal *, integer *, doublereal *);
760 integer ir, bdspac, iu;
761 extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *,
762 integer *, doublereal *, doublereal *, integer *, integer *),
763 dlascl_(char *, integer *, integer *, doublereal *, doublereal *,
764 integer *, integer *, doublereal *, integer *, integer *),
765 dgeqrf_(integer *, integer *, doublereal *, integer *,
766 doublereal *, doublereal *, integer *, integer *), dlacpy_(char *,
767 integer *, integer *, doublereal *, integer *, doublereal *,
768 integer *), dlaset_(char *, integer *, integer *,
769 doublereal *, doublereal *, doublereal *, integer *),
770 dbdsqr_(char *, integer *, integer *, integer *, integer *,
771 doublereal *, doublereal *, doublereal *, integer *, doublereal *,
772 integer *, doublereal *, integer *, doublereal *, integer *), dorgbr_(char *, integer *, integer *, integer *,
773 doublereal *, integer *, doublereal *, doublereal *, integer *,
776 extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen);
777 extern integer ilaenv_(integer *, char *, char *, integer *, integer *,
778 integer *, integer *, ftnlen, ftnlen);
779 extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *,
780 integer *, integer *, doublereal *, integer *, doublereal *,
781 doublereal *, integer *, doublereal *, integer *, integer *), dorglq_(integer *, integer *, integer *,
782 doublereal *, integer *, doublereal *, doublereal *, integer *,
783 integer *), dorgqr_(integer *, integer *, integer *, doublereal *,
784 integer *, doublereal *, doublereal *, integer *, integer *);
785 integer ldwrkr, minwrk, ldwrku, maxwrk;
787 logical lquery, wntuas, wntvas;
788 integer lwork_dorgbr_p__, lwork_dorgbr_q__, lwork_dorglq_m__,
789 lwork_dorglq_n__, lwork_dorgqr_m__, lwork_dorgqr_n__, blk, ncu;
790 doublereal dum[1], eps;
794 /* -- LAPACK driver routine (version 3.7.0) -- */
795 /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */
796 /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
800 /* ===================================================================== */
803 /* Test the input arguments */
805 /* Parameter adjustments */
807 a_offset = 1 + a_dim1 * 1;
811 u_offset = 1 + u_dim1 * 1;
814 vt_offset = 1 + vt_dim1 * 1;
820 minmn = f2cmin(*m,*n);
821 wntua = lsame_(jobu, "A");
822 wntus = lsame_(jobu, "S");
823 wntuas = wntua || wntus;
824 wntuo = lsame_(jobu, "O");
825 wntun = lsame_(jobu, "N");
826 wntva = lsame_(jobvt, "A");
827 wntvs = lsame_(jobvt, "S");
828 wntvas = wntva || wntvs;
829 wntvo = lsame_(jobvt, "O");
830 wntvn = lsame_(jobvt, "N");
831 lquery = *lwork == -1;
833 if (! (wntua || wntus || wntuo || wntun)) {
835 } else if (! (wntva || wntvs || wntvo || wntvn) || wntvo && wntuo) {
841 } else if (*lda < f2cmax(1,*m)) {
843 } else if (*ldu < 1 || wntuas && *ldu < *m) {
845 } else if (*ldvt < 1 || wntva && *ldvt < *n || wntvs && *ldvt < minmn) {
849 /* Compute workspace */
850 /* (Note: Comments in the code beginning "Workspace:" describe the */
851 /* minimal amount of workspace needed at that point in the code, */
852 /* as well as the preferred amount for good performance. */
853 /* NB refers to the optimal block size for the immediately */
854 /* following subroutine, as returned by ILAENV.) */
859 if (*m >= *n && minmn > 0) {
861 /* Compute space needed for DBDSQR */
863 /* Writing concatenation */
864 i__1[0] = 1, a__1[0] = jobu;
865 i__1[1] = 1, a__1[1] = jobvt;
866 s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2);
867 mnthr = ilaenv_(&c__6, "DGESVD", ch__1, m, n, &c__0, &c__0, (
868 ftnlen)6, (ftnlen)2);
870 /* Compute space needed for DGEQRF */
871 dgeqrf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr);
872 lwork_dgeqrf__ = (integer) dum[0];
873 /* Compute space needed for DORGQR */
874 dorgqr_(m, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr);
875 lwork_dorgqr_n__ = (integer) dum[0];
876 dorgqr_(m, m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr);
877 lwork_dorgqr_m__ = (integer) dum[0];
878 /* Compute space needed for DGEBRD */
879 dgebrd_(n, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1,
881 lwork_dgebrd__ = (integer) dum[0];
882 /* Compute space needed for DORGBR P */
883 dorgbr_("P", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr);
884 lwork_dorgbr_p__ = (integer) dum[0];
885 /* Compute space needed for DORGBR Q */
886 dorgbr_("Q", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr);
887 lwork_dorgbr_q__ = (integer) dum[0];
892 /* Path 1 (M much larger than N, JOBU='N') */
894 maxwrk = *n + lwork_dgeqrf__;
896 i__2 = maxwrk, i__3 = *n * 3 + lwork_dgebrd__;
897 maxwrk = f2cmax(i__2,i__3);
898 if (wntvo || wntvas) {
900 i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_p__;
901 maxwrk = f2cmax(i__2,i__3);
903 maxwrk = f2cmax(maxwrk,bdspac);
906 minwrk = f2cmax(i__2,bdspac);
907 } else if (wntuo && wntvn) {
909 /* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */
911 wrkbl = *n + lwork_dgeqrf__;
913 i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__;
914 wrkbl = f2cmax(i__2,i__3);
916 i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__;
917 wrkbl = f2cmax(i__2,i__3);
919 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__;
920 wrkbl = f2cmax(i__2,i__3);
921 wrkbl = f2cmax(wrkbl,bdspac);
923 i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n;
924 maxwrk = f2cmax(i__2,i__3);
927 minwrk = f2cmax(i__2,bdspac);
928 } else if (wntuo && wntvas) {
930 /* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or */
933 wrkbl = *n + lwork_dgeqrf__;
935 i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__;
936 wrkbl = f2cmax(i__2,i__3);
938 i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__;
939 wrkbl = f2cmax(i__2,i__3);
941 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__;
942 wrkbl = f2cmax(i__2,i__3);
944 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__;
945 wrkbl = f2cmax(i__2,i__3);
946 wrkbl = f2cmax(wrkbl,bdspac);
948 i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n;
949 maxwrk = f2cmax(i__2,i__3);
952 minwrk = f2cmax(i__2,bdspac);
953 } else if (wntus && wntvn) {
955 /* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */
957 wrkbl = *n + lwork_dgeqrf__;
959 i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__;
960 wrkbl = f2cmax(i__2,i__3);
962 i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__;
963 wrkbl = f2cmax(i__2,i__3);
965 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__;
966 wrkbl = f2cmax(i__2,i__3);
967 wrkbl = f2cmax(wrkbl,bdspac);
968 maxwrk = *n * *n + wrkbl;
971 minwrk = f2cmax(i__2,bdspac);
972 } else if (wntus && wntvo) {
974 /* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */
976 wrkbl = *n + lwork_dgeqrf__;
978 i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__;
979 wrkbl = f2cmax(i__2,i__3);
981 i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__;
982 wrkbl = f2cmax(i__2,i__3);
984 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__;
985 wrkbl = f2cmax(i__2,i__3);
987 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__;
988 wrkbl = f2cmax(i__2,i__3);
989 wrkbl = f2cmax(wrkbl,bdspac);
990 maxwrk = (*n << 1) * *n + wrkbl;
993 minwrk = f2cmax(i__2,bdspac);
994 } else if (wntus && wntvas) {
996 /* Path 6 (M much larger than N, JOBU='S', JOBVT='S' or */
999 wrkbl = *n + lwork_dgeqrf__;
1001 i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__;
1002 wrkbl = f2cmax(i__2,i__3);
1004 i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__;
1005 wrkbl = f2cmax(i__2,i__3);
1007 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__;
1008 wrkbl = f2cmax(i__2,i__3);
1010 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__;
1011 wrkbl = f2cmax(i__2,i__3);
1012 wrkbl = f2cmax(wrkbl,bdspac);
1013 maxwrk = *n * *n + wrkbl;
1016 minwrk = f2cmax(i__2,bdspac);
1017 } else if (wntua && wntvn) {
1019 /* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */
1021 wrkbl = *n + lwork_dgeqrf__;
1023 i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__;
1024 wrkbl = f2cmax(i__2,i__3);
1026 i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__;
1027 wrkbl = f2cmax(i__2,i__3);
1029 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__;
1030 wrkbl = f2cmax(i__2,i__3);
1031 wrkbl = f2cmax(wrkbl,bdspac);
1032 maxwrk = *n * *n + wrkbl;
1035 minwrk = f2cmax(i__2,bdspac);
1036 } else if (wntua && wntvo) {
1038 /* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */
1040 wrkbl = *n + lwork_dgeqrf__;
1042 i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__;
1043 wrkbl = f2cmax(i__2,i__3);
1045 i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__;
1046 wrkbl = f2cmax(i__2,i__3);
1048 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__;
1049 wrkbl = f2cmax(i__2,i__3);
1051 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__;
1052 wrkbl = f2cmax(i__2,i__3);
1053 wrkbl = f2cmax(wrkbl,bdspac);
1054 maxwrk = (*n << 1) * *n + wrkbl;
1057 minwrk = f2cmax(i__2,bdspac);
1058 } else if (wntua && wntvas) {
1060 /* Path 9 (M much larger than N, JOBU='A', JOBVT='S' or */
1063 wrkbl = *n + lwork_dgeqrf__;
1065 i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__;
1066 wrkbl = f2cmax(i__2,i__3);
1068 i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__;
1069 wrkbl = f2cmax(i__2,i__3);
1071 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__;
1072 wrkbl = f2cmax(i__2,i__3);
1074 i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__;
1075 wrkbl = f2cmax(i__2,i__3);
1076 wrkbl = f2cmax(wrkbl,bdspac);
1077 maxwrk = *n * *n + wrkbl;
1080 minwrk = f2cmax(i__2,bdspac);
1084 /* Path 10 (M at least N, but not much larger) */
1086 dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &
1088 lwork_dgebrd__ = (integer) dum[0];
1089 maxwrk = *n * 3 + lwork_dgebrd__;
1090 if (wntus || wntuo) {
1091 dorgbr_("Q", m, n, n, &a[a_offset], lda, dum, dum, &c_n1,
1093 lwork_dorgbr_q__ = (integer) dum[0];
1095 i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_q__;
1096 maxwrk = f2cmax(i__2,i__3);
1099 dorgbr_("Q", m, m, n, &a[a_offset], lda, dum, dum, &c_n1,
1101 lwork_dorgbr_q__ = (integer) dum[0];
1103 i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_q__;
1104 maxwrk = f2cmax(i__2,i__3);
1108 i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_p__;
1109 maxwrk = f2cmax(i__2,i__3);
1111 maxwrk = f2cmax(maxwrk,bdspac);
1114 minwrk = f2cmax(i__2,bdspac);
1116 } else if (minmn > 0) {
1118 /* Compute space needed for DBDSQR */
1120 /* Writing concatenation */
1121 i__1[0] = 1, a__1[0] = jobu;
1122 i__1[1] = 1, a__1[1] = jobvt;
1123 s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2);
1124 mnthr = ilaenv_(&c__6, "DGESVD", ch__1, m, n, &c__0, &c__0, (
1125 ftnlen)6, (ftnlen)2);
1127 /* Compute space needed for DGELQF */
1128 dgelqf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr);
1129 lwork_dgelqf__ = (integer) dum[0];
1130 /* Compute space needed for DORGLQ */
1131 dorglq_(n, n, m, dum, n, dum, dum, &c_n1, &ierr);
1132 lwork_dorglq_n__ = (integer) dum[0];
1133 dorglq_(m, n, m, &a[a_offset], lda, dum, dum, &c_n1, &ierr);
1134 lwork_dorglq_m__ = (integer) dum[0];
1135 /* Compute space needed for DGEBRD */
1136 dgebrd_(m, m, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1,
1138 lwork_dgebrd__ = (integer) dum[0];
1139 /* Compute space needed for DORGBR P */
1140 dorgbr_("P", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr);
1141 lwork_dorgbr_p__ = (integer) dum[0];
1142 /* Compute space needed for DORGBR Q */
1143 dorgbr_("Q", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr);
1144 lwork_dorgbr_q__ = (integer) dum[0];
1148 /* Path 1t(N much larger than M, JOBVT='N') */
1150 maxwrk = *m + lwork_dgelqf__;
1152 i__2 = maxwrk, i__3 = *m * 3 + lwork_dgebrd__;
1153 maxwrk = f2cmax(i__2,i__3);
1154 if (wntuo || wntuas) {
1156 i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_q__;
1157 maxwrk = f2cmax(i__2,i__3);
1159 maxwrk = f2cmax(maxwrk,bdspac);
1162 minwrk = f2cmax(i__2,bdspac);
1163 } else if (wntvo && wntun) {
1165 /* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */
1167 wrkbl = *m + lwork_dgelqf__;
1169 i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__;
1170 wrkbl = f2cmax(i__2,i__3);
1172 i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__;
1173 wrkbl = f2cmax(i__2,i__3);
1175 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__;
1176 wrkbl = f2cmax(i__2,i__3);
1177 wrkbl = f2cmax(wrkbl,bdspac);
1179 i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m;
1180 maxwrk = f2cmax(i__2,i__3);
1183 minwrk = f2cmax(i__2,bdspac);
1184 } else if (wntvo && wntuas) {
1186 /* Path 3t(N much larger than M, JOBU='S' or 'A', */
1189 wrkbl = *m + lwork_dgelqf__;
1191 i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__;
1192 wrkbl = f2cmax(i__2,i__3);
1194 i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__;
1195 wrkbl = f2cmax(i__2,i__3);
1197 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__;
1198 wrkbl = f2cmax(i__2,i__3);
1200 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__;
1201 wrkbl = f2cmax(i__2,i__3);
1202 wrkbl = f2cmax(wrkbl,bdspac);
1204 i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m;
1205 maxwrk = f2cmax(i__2,i__3);
1208 minwrk = f2cmax(i__2,bdspac);
1209 } else if (wntvs && wntun) {
1211 /* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */
1213 wrkbl = *m + lwork_dgelqf__;
1215 i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__;
1216 wrkbl = f2cmax(i__2,i__3);
1218 i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__;
1219 wrkbl = f2cmax(i__2,i__3);
1221 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__;
1222 wrkbl = f2cmax(i__2,i__3);
1223 wrkbl = f2cmax(wrkbl,bdspac);
1224 maxwrk = *m * *m + wrkbl;
1227 minwrk = f2cmax(i__2,bdspac);
1228 } else if (wntvs && wntuo) {
1230 /* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */
1232 wrkbl = *m + lwork_dgelqf__;
1234 i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__;
1235 wrkbl = f2cmax(i__2,i__3);
1237 i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__;
1238 wrkbl = f2cmax(i__2,i__3);
1240 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__;
1241 wrkbl = f2cmax(i__2,i__3);
1243 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__;
1244 wrkbl = f2cmax(i__2,i__3);
1245 wrkbl = f2cmax(wrkbl,bdspac);
1246 maxwrk = (*m << 1) * *m + wrkbl;
1249 minwrk = f2cmax(i__2,bdspac);
1250 } else if (wntvs && wntuas) {
1252 /* Path 6t(N much larger than M, JOBU='S' or 'A', */
1255 wrkbl = *m + lwork_dgelqf__;
1257 i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__;
1258 wrkbl = f2cmax(i__2,i__3);
1260 i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__;
1261 wrkbl = f2cmax(i__2,i__3);
1263 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__;
1264 wrkbl = f2cmax(i__2,i__3);
1266 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__;
1267 wrkbl = f2cmax(i__2,i__3);
1268 wrkbl = f2cmax(wrkbl,bdspac);
1269 maxwrk = *m * *m + wrkbl;
1272 minwrk = f2cmax(i__2,bdspac);
1273 } else if (wntva && wntun) {
1275 /* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */
1277 wrkbl = *m + lwork_dgelqf__;
1279 i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__;
1280 wrkbl = f2cmax(i__2,i__3);
1282 i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__;
1283 wrkbl = f2cmax(i__2,i__3);
1285 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__;
1286 wrkbl = f2cmax(i__2,i__3);
1287 wrkbl = f2cmax(wrkbl,bdspac);
1288 maxwrk = *m * *m + wrkbl;
1291 minwrk = f2cmax(i__2,bdspac);
1292 } else if (wntva && wntuo) {
1294 /* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */
1296 wrkbl = *m + lwork_dgelqf__;
1298 i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__;
1299 wrkbl = f2cmax(i__2,i__3);
1301 i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__;
1302 wrkbl = f2cmax(i__2,i__3);
1304 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__;
1305 wrkbl = f2cmax(i__2,i__3);
1307 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__;
1308 wrkbl = f2cmax(i__2,i__3);
1309 wrkbl = f2cmax(wrkbl,bdspac);
1310 maxwrk = (*m << 1) * *m + wrkbl;
1313 minwrk = f2cmax(i__2,bdspac);
1314 } else if (wntva && wntuas) {
1316 /* Path 9t(N much larger than M, JOBU='S' or 'A', */
1319 wrkbl = *m + lwork_dgelqf__;
1321 i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__;
1322 wrkbl = f2cmax(i__2,i__3);
1324 i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__;
1325 wrkbl = f2cmax(i__2,i__3);
1327 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__;
1328 wrkbl = f2cmax(i__2,i__3);
1330 i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__;
1331 wrkbl = f2cmax(i__2,i__3);
1332 wrkbl = f2cmax(wrkbl,bdspac);
1333 maxwrk = *m * *m + wrkbl;
1336 minwrk = f2cmax(i__2,bdspac);
1340 /* Path 10t(N greater than M, but not much larger) */
1342 dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &
1344 lwork_dgebrd__ = (integer) dum[0];
1345 maxwrk = *m * 3 + lwork_dgebrd__;
1346 if (wntvs || wntvo) {
1347 /* Compute space needed for DORGBR P */
1348 dorgbr_("P", m, n, m, &a[a_offset], n, dum, dum, &c_n1, &
1350 lwork_dorgbr_p__ = (integer) dum[0];
1352 i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_p__;
1353 maxwrk = f2cmax(i__2,i__3);
1356 dorgbr_("P", n, n, m, &a[a_offset], n, dum, dum, &c_n1, &
1358 lwork_dorgbr_p__ = (integer) dum[0];
1360 i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_p__;
1361 maxwrk = f2cmax(i__2,i__3);
1365 i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_q__;
1366 maxwrk = f2cmax(i__2,i__3);
1368 maxwrk = f2cmax(maxwrk,bdspac);
1371 minwrk = f2cmax(i__2,bdspac);
1374 maxwrk = f2cmax(maxwrk,minwrk);
1375 work[1] = (doublereal) maxwrk;
1377 if (*lwork < minwrk && ! lquery) {
1384 xerbla_("DGESVD", &i__2, (ftnlen)6);
1386 } else if (lquery) {
1390 /* Quick return if possible */
1392 if (*m == 0 || *n == 0) {
1396 /* Get machine constants */
1399 smlnum = sqrt(dlamch_("S")) / eps;
1400 bignum = 1. / smlnum;
1402 /* Scale A if f2cmax element outside range [SMLNUM,BIGNUM] */
1404 anrm = dlange_("M", m, n, &a[a_offset], lda, dum);
1406 if (anrm > 0. && anrm < smlnum) {
1408 dlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, &
1410 } else if (anrm > bignum) {
1412 dlascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, &
1418 /* A has at least as many rows as columns. If A has sufficiently */
1419 /* more rows than columns, first reduce using the QR */
1420 /* decomposition (if sufficient workspace available) */
1426 /* Path 1 (M much larger than N, JOBU='N') */
1427 /* No left singular vectors to be computed */
1433 /* (Workspace: need 2*N, prefer N + N*NB) */
1435 i__2 = *lwork - iwork + 1;
1436 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &
1439 /* Zero out below R */
1444 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &a[a_dim1 + 2],
1452 /* Bidiagonalize R in A */
1453 /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */
1455 i__2 = *lwork - iwork + 1;
1456 dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[
1457 itauq], &work[itaup], &work[iwork], &i__2, &ierr);
1459 if (wntvo || wntvas) {
1461 /* If right singular vectors desired, generate P'. */
1462 /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */
1464 i__2 = *lwork - iwork + 1;
1465 dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], &
1466 work[iwork], &i__2, &ierr);
1471 /* Perform bidiagonal QR iteration, computing right */
1472 /* singular vectors of A in A if desired */
1473 /* (Workspace: need BDSPAC) */
1475 dbdsqr_("U", n, &ncvt, &c__0, &c__0, &s[1], &work[ie], &a[
1476 a_offset], lda, dum, &c__1, dum, &c__1, &work[iwork],
1479 /* If right singular vectors desired in VT, copy them there */
1482 dlacpy_("F", n, n, &a[a_offset], lda, &vt[vt_offset],
1486 } else if (wntuo && wntvn) {
1488 /* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */
1489 /* N left singular vectors to be overwritten on A and */
1490 /* no right singular vectors to be computed */
1494 if (*lwork >= *n * *n + f2cmax(i__2,bdspac)) {
1496 /* Sufficient workspace for a fast algorithm */
1500 i__2 = wrkbl, i__3 = *lda * *n + *n;
1501 if (*lwork >= f2cmax(i__2,i__3) + *lda * *n) {
1503 /* WORK(IU) is LDA by N, WORK(IR) is LDA by N */
1507 } else /* if(complicated condition) */ {
1509 i__2 = wrkbl, i__3 = *lda * *n + *n;
1510 if (*lwork >= f2cmax(i__2,i__3) + *n * *n) {
1512 /* WORK(IU) is LDA by N, WORK(IR) is N by N */
1518 /* WORK(IU) is LDWRKU by N, WORK(IR) is N by N */
1520 ldwrku = (*lwork - *n * *n - *n) / *n;
1524 itau = ir + ldwrkr * *n;
1528 /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */
1530 i__2 = *lwork - iwork + 1;
1531 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork]
1534 /* Copy R to WORK(IR) and zero out below it */
1536 dlacpy_("U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr);
1539 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + 1],
1542 /* Generate Q in A */
1543 /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */
1545 i__2 = *lwork - iwork + 1;
1546 dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[
1547 iwork], &i__2, &ierr);
1553 /* Bidiagonalize R in WORK(IR) */
1554 /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */
1556 i__2 = *lwork - iwork + 1;
1557 dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[
1558 itauq], &work[itaup], &work[iwork], &i__2, &ierr);
1560 /* Generate left vectors bidiagonalizing R */
1561 /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */
1563 i__2 = *lwork - iwork + 1;
1564 dorgbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], &
1565 work[iwork], &i__2, &ierr);
1568 /* Perform bidiagonal QR iteration, computing left */
1569 /* singular vectors of R in WORK(IR) */
1570 /* (Workspace: need N*N + BDSPAC) */
1572 dbdsqr_("U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, &
1573 c__1, &work[ir], &ldwrkr, dum, &c__1, &work[iwork]
1577 /* Multiply Q in A by left singular vectors of R in */
1578 /* WORK(IR), storing result in WORK(IU) and copying to A */
1579 /* (Workspace: need N*N + 2*N, prefer N*N + M*N + N) */
1583 for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ +=
1586 i__4 = *m - i__ + 1;
1587 chunk = f2cmin(i__4,ldwrku);
1588 dgemm_("N", "N", &chunk, n, n, &c_b79, &a[i__ +
1589 a_dim1], lda, &work[ir], &ldwrkr, &c_b57, &
1591 dlacpy_("F", &chunk, n, &work[iu], &ldwrku, &a[i__ +
1598 /* Insufficient workspace for a fast algorithm */
1605 /* Bidiagonalize A */
1606 /* (Workspace: need 3*N + M, prefer 3*N + (M + N)*NB) */
1608 i__3 = *lwork - iwork + 1;
1609 dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[
1610 itauq], &work[itaup], &work[iwork], &i__3, &ierr);
1612 /* Generate left vectors bidiagonalizing A */
1613 /* (Workspace: need 4*N, prefer 3*N + N*NB) */
1615 i__3 = *lwork - iwork + 1;
1616 dorgbr_("Q", m, n, n, &a[a_offset], lda, &work[itauq], &
1617 work[iwork], &i__3, &ierr);
1620 /* Perform bidiagonal QR iteration, computing left */
1621 /* singular vectors of A in A */
1622 /* (Workspace: need BDSPAC) */
1624 dbdsqr_("U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, &
1625 c__1, &a[a_offset], lda, dum, &c__1, &work[iwork],
1630 } else if (wntuo && wntvas) {
1632 /* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A') */
1633 /* N left singular vectors to be overwritten on A and */
1634 /* N right singular vectors to be computed in VT */
1638 if (*lwork >= *n * *n + f2cmax(i__3,bdspac)) {
1640 /* Sufficient workspace for a fast algorithm */
1644 i__3 = wrkbl, i__2 = *lda * *n + *n;
1645 if (*lwork >= f2cmax(i__3,i__2) + *lda * *n) {
1647 /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */
1651 } else /* if(complicated condition) */ {
1653 i__3 = wrkbl, i__2 = *lda * *n + *n;
1654 if (*lwork >= f2cmax(i__3,i__2) + *n * *n) {
1656 /* WORK(IU) is LDA by N and WORK(IR) is N by N */
1662 /* WORK(IU) is LDWRKU by N and WORK(IR) is N by N */
1664 ldwrku = (*lwork - *n * *n - *n) / *n;
1668 itau = ir + ldwrkr * *n;
1672 /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */
1674 i__3 = *lwork - iwork + 1;
1675 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork]
1678 /* Copy R to VT, zeroing out below it */
1680 dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset],
1685 dlaset_("L", &i__3, &i__2, &c_b57, &c_b57, &vt[
1686 vt_dim1 + 2], ldvt);
1689 /* Generate Q in A */
1690 /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */
1692 i__3 = *lwork - iwork + 1;
1693 dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[
1694 iwork], &i__3, &ierr);
1700 /* Bidiagonalize R in VT, copying result to WORK(IR) */
1701 /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */
1703 i__3 = *lwork - iwork + 1;
1704 dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], &
1705 work[itauq], &work[itaup], &work[iwork], &i__3, &
1707 dlacpy_("L", n, n, &vt[vt_offset], ldvt, &work[ir], &
1710 /* Generate left vectors bidiagonalizing R in WORK(IR) */
1711 /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */
1713 i__3 = *lwork - iwork + 1;
1714 dorgbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], &
1715 work[iwork], &i__3, &ierr);
1717 /* Generate right vectors bidiagonalizing R in VT */
1718 /* (Workspace: need N*N + 4*N-1, prefer N*N + 3*N + (N-1)*NB) */
1720 i__3 = *lwork - iwork + 1;
1721 dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup],
1722 &work[iwork], &i__3, &ierr);
1725 /* Perform bidiagonal QR iteration, computing left */
1726 /* singular vectors of R in WORK(IR) and computing right */
1727 /* singular vectors of R in VT */
1728 /* (Workspace: need N*N + BDSPAC) */
1730 dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &vt[
1731 vt_offset], ldvt, &work[ir], &ldwrkr, dum, &c__1,
1732 &work[iwork], info);
1735 /* Multiply Q in A by left singular vectors of R in */
1736 /* WORK(IR), storing result in WORK(IU) and copying to A */
1737 /* (Workspace: need N*N + 2*N, prefer N*N + M*N + N) */
1741 for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ +=
1744 i__4 = *m - i__ + 1;
1745 chunk = f2cmin(i__4,ldwrku);
1746 dgemm_("N", "N", &chunk, n, n, &c_b79, &a[i__ +
1747 a_dim1], lda, &work[ir], &ldwrkr, &c_b57, &
1749 dlacpy_("F", &chunk, n, &work[iu], &ldwrku, &a[i__ +
1756 /* Insufficient workspace for a fast algorithm */
1762 /* (Workspace: need 2*N, prefer N + N*NB) */
1764 i__2 = *lwork - iwork + 1;
1765 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork]
1768 /* Copy R to VT, zeroing out below it */
1770 dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset],
1775 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &vt[
1776 vt_dim1 + 2], ldvt);
1779 /* Generate Q in A */
1780 /* (Workspace: need 2*N, prefer N + N*NB) */
1782 i__2 = *lwork - iwork + 1;
1783 dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[
1784 iwork], &i__2, &ierr);
1790 /* Bidiagonalize R in VT */
1791 /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */
1793 i__2 = *lwork - iwork + 1;
1794 dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], &
1795 work[itauq], &work[itaup], &work[iwork], &i__2, &
1798 /* Multiply Q in A by left vectors bidiagonalizing R */
1799 /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */
1801 i__2 = *lwork - iwork + 1;
1802 dormbr_("Q", "R", "N", m, n, n, &vt[vt_offset], ldvt, &
1803 work[itauq], &a[a_offset], lda, &work[iwork], &
1806 /* Generate right vectors bidiagonalizing R in VT */
1807 /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */
1809 i__2 = *lwork - iwork + 1;
1810 dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup],
1811 &work[iwork], &i__2, &ierr);
1814 /* Perform bidiagonal QR iteration, computing left */
1815 /* singular vectors of A in A and computing right */
1816 /* singular vectors of A in VT */
1817 /* (Workspace: need BDSPAC) */
1819 dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &vt[
1820 vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, &
1829 /* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */
1830 /* N left singular vectors to be computed in U and */
1831 /* no right singular vectors to be computed */
1835 if (*lwork >= *n * *n + f2cmax(i__2,bdspac)) {
1837 /* Sufficient workspace for a fast algorithm */
1840 if (*lwork >= wrkbl + *lda * *n) {
1842 /* WORK(IR) is LDA by N */
1847 /* WORK(IR) is N by N */
1851 itau = ir + ldwrkr * *n;
1855 /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */
1857 i__2 = *lwork - iwork + 1;
1858 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
1859 iwork], &i__2, &ierr);
1861 /* Copy R to WORK(IR), zeroing out below it */
1863 dlacpy_("U", n, n, &a[a_offset], lda, &work[ir], &
1867 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &work[ir +
1870 /* Generate Q in A */
1871 /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */
1873 i__2 = *lwork - iwork + 1;
1874 dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &
1875 work[iwork], &i__2, &ierr);
1881 /* Bidiagonalize R in WORK(IR) */
1882 /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */
1884 i__2 = *lwork - iwork + 1;
1885 dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &
1886 work[itauq], &work[itaup], &work[iwork], &
1889 /* Generate left vectors bidiagonalizing R in WORK(IR) */
1890 /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */
1892 i__2 = *lwork - iwork + 1;
1893 dorgbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq]
1894 , &work[iwork], &i__2, &ierr);
1897 /* Perform bidiagonal QR iteration, computing left */
1898 /* singular vectors of R in WORK(IR) */
1899 /* (Workspace: need N*N + BDSPAC) */
1901 dbdsqr_("U", n, &c__0, n, &c__0, &s[1], &work[ie],
1902 dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, &
1905 /* Multiply Q in A by left singular vectors of R in */
1906 /* WORK(IR), storing result in U */
1907 /* (Workspace: need N*N) */
1909 dgemm_("N", "N", m, n, n, &c_b79, &a[a_offset], lda, &
1910 work[ir], &ldwrkr, &c_b57, &u[u_offset], ldu);
1914 /* Insufficient workspace for a fast algorithm */
1919 /* Compute A=Q*R, copying result to U */
1920 /* (Workspace: need 2*N, prefer N + N*NB) */
1922 i__2 = *lwork - iwork + 1;
1923 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
1924 iwork], &i__2, &ierr);
1925 dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
1928 /* Generate Q in U */
1929 /* (Workspace: need 2*N, prefer N + N*NB) */
1931 i__2 = *lwork - iwork + 1;
1932 dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], &
1933 work[iwork], &i__2, &ierr);
1939 /* Zero out below R in A */
1944 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &a[
1948 /* Bidiagonalize R in A */
1949 /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */
1951 i__2 = *lwork - iwork + 1;
1952 dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &
1953 work[itauq], &work[itaup], &work[iwork], &
1956 /* Multiply Q in U by left vectors bidiagonalizing R */
1957 /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */
1959 i__2 = *lwork - iwork + 1;
1960 dormbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, &
1961 work[itauq], &u[u_offset], ldu, &work[iwork],
1966 /* Perform bidiagonal QR iteration, computing left */
1967 /* singular vectors of A in U */
1968 /* (Workspace: need BDSPAC) */
1970 dbdsqr_("U", n, &c__0, m, &c__0, &s[1], &work[ie],
1971 dum, &c__1, &u[u_offset], ldu, dum, &c__1, &
1978 /* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */
1979 /* N left singular vectors to be computed in U and */
1980 /* N right singular vectors to be overwritten on A */
1984 if (*lwork >= (*n << 1) * *n + f2cmax(i__2,bdspac)) {
1986 /* Sufficient workspace for a fast algorithm */
1989 if (*lwork >= wrkbl + (*lda << 1) * *n) {
1991 /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */
1994 ir = iu + ldwrku * *n;
1996 } else if (*lwork >= wrkbl + (*lda + *n) * *n) {
1998 /* WORK(IU) is LDA by N and WORK(IR) is N by N */
2001 ir = iu + ldwrku * *n;
2005 /* WORK(IU) is N by N and WORK(IR) is N by N */
2008 ir = iu + ldwrku * *n;
2011 itau = ir + ldwrkr * *n;
2015 /* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) */
2017 i__2 = *lwork - iwork + 1;
2018 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2019 iwork], &i__2, &ierr);
2021 /* Copy R to WORK(IU), zeroing out below it */
2023 dlacpy_("U", n, n, &a[a_offset], lda, &work[iu], &
2027 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &work[iu +
2030 /* Generate Q in A */
2031 /* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) */
2033 i__2 = *lwork - iwork + 1;
2034 dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &
2035 work[iwork], &i__2, &ierr);
2041 /* Bidiagonalize R in WORK(IU), copying result to */
2043 /* (Workspace: need 2*N*N + 4*N, */
2044 /* prefer 2*N*N+3*N+2*N*NB) */
2046 i__2 = *lwork - iwork + 1;
2047 dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], &
2048 work[itauq], &work[itaup], &work[iwork], &
2050 dlacpy_("U", n, n, &work[iu], &ldwrku, &work[ir], &
2053 /* Generate left bidiagonalizing vectors in WORK(IU) */
2054 /* (Workspace: need 2*N*N + 4*N, prefer 2*N*N + 3*N + N*NB) */
2056 i__2 = *lwork - iwork + 1;
2057 dorgbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq]
2058 , &work[iwork], &i__2, &ierr);
2060 /* Generate right bidiagonalizing vectors in WORK(IR) */
2061 /* (Workspace: need 2*N*N + 4*N-1, */
2062 /* prefer 2*N*N+3*N+(N-1)*NB) */
2064 i__2 = *lwork - iwork + 1;
2065 dorgbr_("P", n, n, n, &work[ir], &ldwrkr, &work[itaup]
2066 , &work[iwork], &i__2, &ierr);
2069 /* Perform bidiagonal QR iteration, computing left */
2070 /* singular vectors of R in WORK(IU) and computing */
2071 /* right singular vectors of R in WORK(IR) */
2072 /* (Workspace: need 2*N*N + BDSPAC) */
2074 dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &work[
2075 ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1,
2076 &work[iwork], info);
2078 /* Multiply Q in A by left singular vectors of R in */
2079 /* WORK(IU), storing result in U */
2080 /* (Workspace: need N*N) */
2082 dgemm_("N", "N", m, n, n, &c_b79, &a[a_offset], lda, &
2083 work[iu], &ldwrku, &c_b57, &u[u_offset], ldu);
2085 /* Copy right singular vectors of R to A */
2086 /* (Workspace: need N*N) */
2088 dlacpy_("F", n, n, &work[ir], &ldwrkr, &a[a_offset],
2093 /* Insufficient workspace for a fast algorithm */
2098 /* Compute A=Q*R, copying result to U */
2099 /* (Workspace: need 2*N, prefer N + N*NB) */
2101 i__2 = *lwork - iwork + 1;
2102 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2103 iwork], &i__2, &ierr);
2104 dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2107 /* Generate Q in U */
2108 /* (Workspace: need 2*N, prefer N + N*NB) */
2110 i__2 = *lwork - iwork + 1;
2111 dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], &
2112 work[iwork], &i__2, &ierr);
2118 /* Zero out below R in A */
2123 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &a[
2127 /* Bidiagonalize R in A */
2128 /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */
2130 i__2 = *lwork - iwork + 1;
2131 dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &
2132 work[itauq], &work[itaup], &work[iwork], &
2135 /* Multiply Q in U by left vectors bidiagonalizing R */
2136 /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */
2138 i__2 = *lwork - iwork + 1;
2139 dormbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, &
2140 work[itauq], &u[u_offset], ldu, &work[iwork],
2144 /* Generate right vectors bidiagonalizing R in A */
2145 /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */
2147 i__2 = *lwork - iwork + 1;
2148 dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup],
2149 &work[iwork], &i__2, &ierr);
2152 /* Perform bidiagonal QR iteration, computing left */
2153 /* singular vectors of A in U and computing right */
2154 /* singular vectors of A in A */
2155 /* (Workspace: need BDSPAC) */
2157 dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &a[
2158 a_offset], lda, &u[u_offset], ldu, dum, &c__1,
2159 &work[iwork], info);
2163 } else if (wntvas) {
2165 /* Path 6 (M much larger than N, JOBU='S', JOBVT='S' */
2167 /* N left singular vectors to be computed in U and */
2168 /* N right singular vectors to be computed in VT */
2172 if (*lwork >= *n * *n + f2cmax(i__2,bdspac)) {
2174 /* Sufficient workspace for a fast algorithm */
2177 if (*lwork >= wrkbl + *lda * *n) {
2179 /* WORK(IU) is LDA by N */
2184 /* WORK(IU) is N by N */
2188 itau = iu + ldwrku * *n;
2192 /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */
2194 i__2 = *lwork - iwork + 1;
2195 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2196 iwork], &i__2, &ierr);
2198 /* Copy R to WORK(IU), zeroing out below it */
2200 dlacpy_("U", n, n, &a[a_offset], lda, &work[iu], &
2204 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &work[iu +
2207 /* Generate Q in A */
2208 /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */
2210 i__2 = *lwork - iwork + 1;
2211 dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &
2212 work[iwork], &i__2, &ierr);
2218 /* Bidiagonalize R in WORK(IU), copying result to VT */
2219 /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */
2221 i__2 = *lwork - iwork + 1;
2222 dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], &
2223 work[itauq], &work[itaup], &work[iwork], &
2225 dlacpy_("U", n, n, &work[iu], &ldwrku, &vt[vt_offset],
2228 /* Generate left bidiagonalizing vectors in WORK(IU) */
2229 /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */
2231 i__2 = *lwork - iwork + 1;
2232 dorgbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq]
2233 , &work[iwork], &i__2, &ierr);
2235 /* Generate right bidiagonalizing vectors in VT */
2236 /* (Workspace: need N*N + 4*N-1, */
2237 /* prefer N*N+3*N+(N-1)*NB) */
2239 i__2 = *lwork - iwork + 1;
2240 dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[
2241 itaup], &work[iwork], &i__2, &ierr)
2245 /* Perform bidiagonal QR iteration, computing left */
2246 /* singular vectors of R in WORK(IU) and computing */
2247 /* right singular vectors of R in VT */
2248 /* (Workspace: need N*N + BDSPAC) */
2250 dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &vt[
2251 vt_offset], ldvt, &work[iu], &ldwrku, dum, &
2252 c__1, &work[iwork], info);
2254 /* Multiply Q in A by left singular vectors of R in */
2255 /* WORK(IU), storing result in U */
2256 /* (Workspace: need N*N) */
2258 dgemm_("N", "N", m, n, n, &c_b79, &a[a_offset], lda, &
2259 work[iu], &ldwrku, &c_b57, &u[u_offset], ldu);
2263 /* Insufficient workspace for a fast algorithm */
2268 /* Compute A=Q*R, copying result to U */
2269 /* (Workspace: need 2*N, prefer N + N*NB) */
2271 i__2 = *lwork - iwork + 1;
2272 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2273 iwork], &i__2, &ierr);
2274 dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2277 /* Generate Q in U */
2278 /* (Workspace: need 2*N, prefer N + N*NB) */
2280 i__2 = *lwork - iwork + 1;
2281 dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], &
2282 work[iwork], &i__2, &ierr);
2284 /* Copy R to VT, zeroing out below it */
2286 dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset],
2291 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &vt[
2292 vt_dim1 + 2], ldvt);
2299 /* Bidiagonalize R in VT */
2300 /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */
2302 i__2 = *lwork - iwork + 1;
2303 dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie],
2304 &work[itauq], &work[itaup], &work[iwork], &
2307 /* Multiply Q in U by left bidiagonalizing vectors */
2309 /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */
2311 i__2 = *lwork - iwork + 1;
2312 dormbr_("Q", "R", "N", m, n, n, &vt[vt_offset], ldvt,
2313 &work[itauq], &u[u_offset], ldu, &work[iwork],
2316 /* Generate right bidiagonalizing vectors in VT */
2317 /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */
2319 i__2 = *lwork - iwork + 1;
2320 dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[
2321 itaup], &work[iwork], &i__2, &ierr)
2325 /* Perform bidiagonal QR iteration, computing left */
2326 /* singular vectors of A in U and computing right */
2327 /* singular vectors of A in VT */
2328 /* (Workspace: need BDSPAC) */
2330 dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &vt[
2331 vt_offset], ldvt, &u[u_offset], ldu, dum, &
2332 c__1, &work[iwork], info);
2342 /* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */
2343 /* M left singular vectors to be computed in U and */
2344 /* no right singular vectors to be computed */
2347 i__2 = *n + *m, i__3 = *n << 2, i__2 = f2cmax(i__2,i__3);
2348 if (*lwork >= *n * *n + f2cmax(i__2,bdspac)) {
2350 /* Sufficient workspace for a fast algorithm */
2353 if (*lwork >= wrkbl + *lda * *n) {
2355 /* WORK(IR) is LDA by N */
2360 /* WORK(IR) is N by N */
2364 itau = ir + ldwrkr * *n;
2367 /* Compute A=Q*R, copying result to U */
2368 /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */
2370 i__2 = *lwork - iwork + 1;
2371 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2372 iwork], &i__2, &ierr);
2373 dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2376 /* Copy R to WORK(IR), zeroing out below it */
2378 dlacpy_("U", n, n, &a[a_offset], lda, &work[ir], &
2382 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &work[ir +
2385 /* Generate Q in U */
2386 /* (Workspace: need N*N + N + M, prefer N*N + N + M*NB) */
2388 i__2 = *lwork - iwork + 1;
2389 dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &
2390 work[iwork], &i__2, &ierr);
2396 /* Bidiagonalize R in WORK(IR) */
2397 /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */
2399 i__2 = *lwork - iwork + 1;
2400 dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &
2401 work[itauq], &work[itaup], &work[iwork], &
2404 /* Generate left bidiagonalizing vectors in WORK(IR) */
2405 /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */
2407 i__2 = *lwork - iwork + 1;
2408 dorgbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq]
2409 , &work[iwork], &i__2, &ierr);
2412 /* Perform bidiagonal QR iteration, computing left */
2413 /* singular vectors of R in WORK(IR) */
2414 /* (Workspace: need N*N + BDSPAC) */
2416 dbdsqr_("U", n, &c__0, n, &c__0, &s[1], &work[ie],
2417 dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, &
2420 /* Multiply Q in U by left singular vectors of R in */
2421 /* WORK(IR), storing result in A */
2422 /* (Workspace: need N*N) */
2424 dgemm_("N", "N", m, n, n, &c_b79, &u[u_offset], ldu, &
2425 work[ir], &ldwrkr, &c_b57, &a[a_offset], lda);
2427 /* Copy left singular vectors of A from A to U */
2429 dlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset],
2434 /* Insufficient workspace for a fast algorithm */
2439 /* Compute A=Q*R, copying result to U */
2440 /* (Workspace: need 2*N, prefer N + N*NB) */
2442 i__2 = *lwork - iwork + 1;
2443 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2444 iwork], &i__2, &ierr);
2445 dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2448 /* Generate Q in U */
2449 /* (Workspace: need N + M, prefer N + M*NB) */
2451 i__2 = *lwork - iwork + 1;
2452 dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &
2453 work[iwork], &i__2, &ierr);
2459 /* Zero out below R in A */
2464 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &a[
2468 /* Bidiagonalize R in A */
2469 /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */
2471 i__2 = *lwork - iwork + 1;
2472 dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &
2473 work[itauq], &work[itaup], &work[iwork], &
2476 /* Multiply Q in U by left bidiagonalizing vectors */
2478 /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */
2480 i__2 = *lwork - iwork + 1;
2481 dormbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, &
2482 work[itauq], &u[u_offset], ldu, &work[iwork],
2487 /* Perform bidiagonal QR iteration, computing left */
2488 /* singular vectors of A in U */
2489 /* (Workspace: need BDSPAC) */
2491 dbdsqr_("U", n, &c__0, m, &c__0, &s[1], &work[ie],
2492 dum, &c__1, &u[u_offset], ldu, dum, &c__1, &
2499 /* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */
2500 /* M left singular vectors to be computed in U and */
2501 /* N right singular vectors to be overwritten on A */
2504 i__2 = *n + *m, i__3 = *n << 2, i__2 = f2cmax(i__2,i__3);
2505 if (*lwork >= (*n << 1) * *n + f2cmax(i__2,bdspac)) {
2507 /* Sufficient workspace for a fast algorithm */
2510 if (*lwork >= wrkbl + (*lda << 1) * *n) {
2512 /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */
2515 ir = iu + ldwrku * *n;
2517 } else if (*lwork >= wrkbl + (*lda + *n) * *n) {
2519 /* WORK(IU) is LDA by N and WORK(IR) is N by N */
2522 ir = iu + ldwrku * *n;
2526 /* WORK(IU) is N by N and WORK(IR) is N by N */
2529 ir = iu + ldwrku * *n;
2532 itau = ir + ldwrkr * *n;
2535 /* Compute A=Q*R, copying result to U */
2536 /* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) */
2538 i__2 = *lwork - iwork + 1;
2539 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2540 iwork], &i__2, &ierr);
2541 dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2544 /* Generate Q in U */
2545 /* (Workspace: need 2*N*N + N + M, prefer 2*N*N + N + M*NB) */
2547 i__2 = *lwork - iwork + 1;
2548 dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &
2549 work[iwork], &i__2, &ierr);
2551 /* Copy R to WORK(IU), zeroing out below it */
2553 dlacpy_("U", n, n, &a[a_offset], lda, &work[iu], &
2557 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &work[iu +
2564 /* Bidiagonalize R in WORK(IU), copying result to */
2566 /* (Workspace: need 2*N*N + 4*N, */
2567 /* prefer 2*N*N+3*N+2*N*NB) */
2569 i__2 = *lwork - iwork + 1;
2570 dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], &
2571 work[itauq], &work[itaup], &work[iwork], &
2573 dlacpy_("U", n, n, &work[iu], &ldwrku, &work[ir], &
2576 /* Generate left bidiagonalizing vectors in WORK(IU) */
2577 /* (Workspace: need 2*N*N + 4*N, prefer 2*N*N + 3*N + N*NB) */
2579 i__2 = *lwork - iwork + 1;
2580 dorgbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq]
2581 , &work[iwork], &i__2, &ierr);
2583 /* Generate right bidiagonalizing vectors in WORK(IR) */
2584 /* (Workspace: need 2*N*N + 4*N-1, */
2585 /* prefer 2*N*N+3*N+(N-1)*NB) */
2587 i__2 = *lwork - iwork + 1;
2588 dorgbr_("P", n, n, n, &work[ir], &ldwrkr, &work[itaup]
2589 , &work[iwork], &i__2, &ierr);
2592 /* Perform bidiagonal QR iteration, computing left */
2593 /* singular vectors of R in WORK(IU) and computing */
2594 /* right singular vectors of R in WORK(IR) */
2595 /* (Workspace: need 2*N*N + BDSPAC) */
2597 dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &work[
2598 ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1,
2599 &work[iwork], info);
2601 /* Multiply Q in U by left singular vectors of R in */
2602 /* WORK(IU), storing result in A */
2603 /* (Workspace: need N*N) */
2605 dgemm_("N", "N", m, n, n, &c_b79, &u[u_offset], ldu, &
2606 work[iu], &ldwrku, &c_b57, &a[a_offset], lda);
2608 /* Copy left singular vectors of A from A to U */
2610 dlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset],
2613 /* Copy right singular vectors of R from WORK(IR) to A */
2615 dlacpy_("F", n, n, &work[ir], &ldwrkr, &a[a_offset],
2620 /* Insufficient workspace for a fast algorithm */
2625 /* Compute A=Q*R, copying result to U */
2626 /* (Workspace: need 2*N, prefer N + N*NB) */
2628 i__2 = *lwork - iwork + 1;
2629 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2630 iwork], &i__2, &ierr);
2631 dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2634 /* Generate Q in U */
2635 /* (Workspace: need N + M, prefer N + M*NB) */
2637 i__2 = *lwork - iwork + 1;
2638 dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &
2639 work[iwork], &i__2, &ierr);
2645 /* Zero out below R in A */
2650 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &a[
2654 /* Bidiagonalize R in A */
2655 /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */
2657 i__2 = *lwork - iwork + 1;
2658 dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &
2659 work[itauq], &work[itaup], &work[iwork], &
2662 /* Multiply Q in U by left bidiagonalizing vectors */
2664 /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */
2666 i__2 = *lwork - iwork + 1;
2667 dormbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, &
2668 work[itauq], &u[u_offset], ldu, &work[iwork],
2672 /* Generate right bidiagonalizing vectors in A */
2673 /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */
2675 i__2 = *lwork - iwork + 1;
2676 dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup],
2677 &work[iwork], &i__2, &ierr);
2680 /* Perform bidiagonal QR iteration, computing left */
2681 /* singular vectors of A in U and computing right */
2682 /* singular vectors of A in A */
2683 /* (Workspace: need BDSPAC) */
2685 dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &a[
2686 a_offset], lda, &u[u_offset], ldu, dum, &c__1,
2687 &work[iwork], info);
2691 } else if (wntvas) {
2693 /* Path 9 (M much larger than N, JOBU='A', JOBVT='S' */
2695 /* M left singular vectors to be computed in U and */
2696 /* N right singular vectors to be computed in VT */
2699 i__2 = *n + *m, i__3 = *n << 2, i__2 = f2cmax(i__2,i__3);
2700 if (*lwork >= *n * *n + f2cmax(i__2,bdspac)) {
2702 /* Sufficient workspace for a fast algorithm */
2705 if (*lwork >= wrkbl + *lda * *n) {
2707 /* WORK(IU) is LDA by N */
2712 /* WORK(IU) is N by N */
2716 itau = iu + ldwrku * *n;
2719 /* Compute A=Q*R, copying result to U */
2720 /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */
2722 i__2 = *lwork - iwork + 1;
2723 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2724 iwork], &i__2, &ierr);
2725 dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2728 /* Generate Q in U */
2729 /* (Workspace: need N*N + N + M, prefer N*N + N + M*NB) */
2731 i__2 = *lwork - iwork + 1;
2732 dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &
2733 work[iwork], &i__2, &ierr);
2735 /* Copy R to WORK(IU), zeroing out below it */
2737 dlacpy_("U", n, n, &a[a_offset], lda, &work[iu], &
2741 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &work[iu +
2748 /* Bidiagonalize R in WORK(IU), copying result to VT */
2749 /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */
2751 i__2 = *lwork - iwork + 1;
2752 dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], &
2753 work[itauq], &work[itaup], &work[iwork], &
2755 dlacpy_("U", n, n, &work[iu], &ldwrku, &vt[vt_offset],
2758 /* Generate left bidiagonalizing vectors in WORK(IU) */
2759 /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */
2761 i__2 = *lwork - iwork + 1;
2762 dorgbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq]
2763 , &work[iwork], &i__2, &ierr);
2765 /* Generate right bidiagonalizing vectors in VT */
2766 /* (Workspace: need N*N + 4*N-1, */
2767 /* prefer N*N+3*N+(N-1)*NB) */
2769 i__2 = *lwork - iwork + 1;
2770 dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[
2771 itaup], &work[iwork], &i__2, &ierr)
2775 /* Perform bidiagonal QR iteration, computing left */
2776 /* singular vectors of R in WORK(IU) and computing */
2777 /* right singular vectors of R in VT */
2778 /* (Workspace: need N*N + BDSPAC) */
2780 dbdsqr_("U", n, n, n, &c__0, &s[1], &work[ie], &vt[
2781 vt_offset], ldvt, &work[iu], &ldwrku, dum, &
2782 c__1, &work[iwork], info);
2784 /* Multiply Q in U by left singular vectors of R in */
2785 /* WORK(IU), storing result in A */
2786 /* (Workspace: need N*N) */
2788 dgemm_("N", "N", m, n, n, &c_b79, &u[u_offset], ldu, &
2789 work[iu], &ldwrku, &c_b57, &a[a_offset], lda);
2791 /* Copy left singular vectors of A from A to U */
2793 dlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset],
2798 /* Insufficient workspace for a fast algorithm */
2803 /* Compute A=Q*R, copying result to U */
2804 /* (Workspace: need 2*N, prefer N + N*NB) */
2806 i__2 = *lwork - iwork + 1;
2807 dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2808 iwork], &i__2, &ierr);
2809 dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2812 /* Generate Q in U */
2813 /* (Workspace: need N + M, prefer N + M*NB) */
2815 i__2 = *lwork - iwork + 1;
2816 dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &
2817 work[iwork], &i__2, &ierr);
2819 /* Copy R from A to VT, zeroing out below it */
2821 dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset],
2826 dlaset_("L", &i__2, &i__3, &c_b57, &c_b57, &vt[
2827 vt_dim1 + 2], ldvt);
2834 /* Bidiagonalize R in VT */
2835 /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */
2837 i__2 = *lwork - iwork + 1;
2838 dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie],
2839 &work[itauq], &work[itaup], &work[iwork], &
2842 /* Multiply Q in U by left bidiagonalizing vectors */
2844 /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */
2846 i__2 = *lwork - iwork + 1;
2847 dormbr_("Q", "R", "N", m, n, n, &vt[vt_offset], ldvt,
2848 &work[itauq], &u[u_offset], ldu, &work[iwork],
2851 /* Generate right bidiagonalizing vectors in VT */
2852 /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */
2854 i__2 = *lwork - iwork + 1;
2855 dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[
2856 itaup], &work[iwork], &i__2, &ierr)
2860 /* Perform bidiagonal QR iteration, computing left */
2861 /* singular vectors of A in U and computing right */
2862 /* singular vectors of A in VT */
2863 /* (Workspace: need BDSPAC) */
2865 dbdsqr_("U", n, n, m, &c__0, &s[1], &work[ie], &vt[
2866 vt_offset], ldvt, &u[u_offset], ldu, dum, &
2867 c__1, &work[iwork], info);
2879 /* Path 10 (M at least N, but not much larger) */
2880 /* Reduce to bidiagonal form without QR decomposition */
2887 /* Bidiagonalize A */
2888 /* (Workspace: need 3*N + M, prefer 3*N + (M + N)*NB) */
2890 i__2 = *lwork - iwork + 1;
2891 dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &
2892 work[itaup], &work[iwork], &i__2, &ierr);
2895 /* If left singular vectors desired in U, copy result to U */
2896 /* and generate left bidiagonalizing vectors in U */
2897 /* (Workspace: need 3*N + NCU, prefer 3*N + NCU*NB) */
2899 dlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu);
2906 i__2 = *lwork - iwork + 1;
2907 dorgbr_("Q", m, &ncu, n, &u[u_offset], ldu, &work[itauq], &
2908 work[iwork], &i__2, &ierr);
2912 /* If right singular vectors desired in VT, copy result to */
2913 /* VT and generate right bidiagonalizing vectors in VT */
2914 /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */
2916 dlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
2917 i__2 = *lwork - iwork + 1;
2918 dorgbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &
2919 work[iwork], &i__2, &ierr);
2923 /* If left singular vectors desired in A, generate left */
2924 /* bidiagonalizing vectors in A */
2925 /* (Workspace: need 4*N, prefer 3*N + N*NB) */
2927 i__2 = *lwork - iwork + 1;
2928 dorgbr_("Q", m, n, n, &a[a_offset], lda, &work[itauq], &work[
2929 iwork], &i__2, &ierr);
2933 /* If right singular vectors desired in A, generate right */
2934 /* bidiagonalizing vectors in A */
2935 /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */
2937 i__2 = *lwork - iwork + 1;
2938 dorgbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], &work[
2939 iwork], &i__2, &ierr);
2942 if (wntuas || wntuo) {
2948 if (wntvas || wntvo) {
2954 if (! wntuo && ! wntvo) {
2956 /* Perform bidiagonal QR iteration, if desired, computing */
2957 /* left singular vectors in U and computing right singular */
2959 /* (Workspace: need BDSPAC) */
2961 dbdsqr_("U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[
2962 vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, &
2964 } else if (! wntuo && wntvo) {
2966 /* Perform bidiagonal QR iteration, if desired, computing */
2967 /* left singular vectors in U and computing right singular */
2969 /* (Workspace: need BDSPAC) */
2971 dbdsqr_("U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[
2972 a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[
2976 /* Perform bidiagonal QR iteration, if desired, computing */
2977 /* left singular vectors in A and computing right singular */
2979 /* (Workspace: need BDSPAC) */
2981 dbdsqr_("U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[
2982 vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, &
2990 /* A has more columns than rows. If A has sufficiently more */
2991 /* columns than rows, first reduce using the LQ decomposition (if */
2992 /* sufficient workspace available) */
2998 /* Path 1t(N much larger than M, JOBVT='N') */
2999 /* No right singular vectors to be computed */
3005 /* (Workspace: need 2*M, prefer M + M*NB) */
3007 i__2 = *lwork - iwork + 1;
3008 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &
3011 /* Zero out above L */
3015 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 << 1) +
3022 /* Bidiagonalize L in A */
3023 /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */
3025 i__2 = *lwork - iwork + 1;
3026 dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[
3027 itauq], &work[itaup], &work[iwork], &i__2, &ierr);
3028 if (wntuo || wntuas) {
3030 /* If left singular vectors desired, generate Q */
3031 /* (Workspace: need 4*M, prefer 3*M + M*NB) */
3033 i__2 = *lwork - iwork + 1;
3034 dorgbr_("Q", m, m, m, &a[a_offset], lda, &work[itauq], &
3035 work[iwork], &i__2, &ierr);
3039 if (wntuo || wntuas) {
3043 /* Perform bidiagonal QR iteration, computing left singular */
3044 /* vectors of A in A if desired */
3045 /* (Workspace: need BDSPAC) */
3047 dbdsqr_("U", m, &c__0, &nru, &c__0, &s[1], &work[ie], dum, &
3048 c__1, &a[a_offset], lda, dum, &c__1, &work[iwork],
3051 /* If left singular vectors desired in U, copy them there */
3054 dlacpy_("F", m, m, &a[a_offset], lda, &u[u_offset], ldu);
3057 } else if (wntvo && wntun) {
3059 /* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */
3060 /* M right singular vectors to be overwritten on A and */
3061 /* no left singular vectors to be computed */
3065 if (*lwork >= *m * *m + f2cmax(i__2,bdspac)) {
3067 /* Sufficient workspace for a fast algorithm */
3071 i__2 = wrkbl, i__3 = *lda * *n + *m;
3072 if (*lwork >= f2cmax(i__2,i__3) + *lda * *m) {
3074 /* WORK(IU) is LDA by N and WORK(IR) is LDA by M */
3079 } else /* if(complicated condition) */ {
3081 i__2 = wrkbl, i__3 = *lda * *n + *m;
3082 if (*lwork >= f2cmax(i__2,i__3) + *m * *m) {
3084 /* WORK(IU) is LDA by N and WORK(IR) is M by M */
3091 /* WORK(IU) is M by CHUNK and WORK(IR) is M by M */
3094 chunk = (*lwork - *m * *m - *m) / *m;
3098 itau = ir + ldwrkr * *m;
3102 /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */
3104 i__2 = *lwork - iwork + 1;
3105 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork]
3108 /* Copy L to WORK(IR) and zero out above it */
3110 dlacpy_("L", m, m, &a[a_offset], lda, &work[ir], &ldwrkr);
3113 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &work[ir +
3116 /* Generate Q in A */
3117 /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */
3119 i__2 = *lwork - iwork + 1;
3120 dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[
3121 iwork], &i__2, &ierr);
3127 /* Bidiagonalize L in WORK(IR) */
3128 /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */
3130 i__2 = *lwork - iwork + 1;
3131 dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], &work[
3132 itauq], &work[itaup], &work[iwork], &i__2, &ierr);
3134 /* Generate right vectors bidiagonalizing L */
3135 /* (Workspace: need M*M + 4*M-1, prefer M*M + 3*M + (M-1)*NB) */
3137 i__2 = *lwork - iwork + 1;
3138 dorgbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup], &
3139 work[iwork], &i__2, &ierr);
3142 /* Perform bidiagonal QR iteration, computing right */
3143 /* singular vectors of L in WORK(IR) */
3144 /* (Workspace: need M*M + BDSPAC) */
3146 dbdsqr_("U", m, m, &c__0, &c__0, &s[1], &work[ie], &work[
3147 ir], &ldwrkr, dum, &c__1, dum, &c__1, &work[iwork]
3151 /* Multiply right singular vectors of L in WORK(IR) by Q */
3152 /* in A, storing result in WORK(IU) and copying to A */
3153 /* (Workspace: need M*M + 2*M, prefer M*M + M*N + M) */
3157 for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ +=
3160 i__4 = *n - i__ + 1;
3161 blk = f2cmin(i__4,chunk);
3162 dgemm_("N", "N", m, &blk, m, &c_b79, &work[ir], &
3163 ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b57, &
3165 dlacpy_("F", m, &blk, &work[iu], &ldwrku, &a[i__ *
3172 /* Insufficient workspace for a fast algorithm */
3179 /* Bidiagonalize A */
3180 /* (Workspace: need 3*M + N, prefer 3*M + (M + N)*NB) */
3182 i__3 = *lwork - iwork + 1;
3183 dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[
3184 itauq], &work[itaup], &work[iwork], &i__3, &ierr);
3186 /* Generate right vectors bidiagonalizing A */
3187 /* (Workspace: need 4*M, prefer 3*M + M*NB) */
3189 i__3 = *lwork - iwork + 1;
3190 dorgbr_("P", m, n, m, &a[a_offset], lda, &work[itaup], &
3191 work[iwork], &i__3, &ierr);
3194 /* Perform bidiagonal QR iteration, computing right */
3195 /* singular vectors of A in A */
3196 /* (Workspace: need BDSPAC) */
3198 dbdsqr_("L", m, n, &c__0, &c__0, &s[1], &work[ie], &a[
3199 a_offset], lda, dum, &c__1, dum, &c__1, &work[
3204 } else if (wntvo && wntuas) {
3206 /* Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O') */
3207 /* M right singular vectors to be overwritten on A and */
3208 /* M left singular vectors to be computed in U */
3212 if (*lwork >= *m * *m + f2cmax(i__3,bdspac)) {
3214 /* Sufficient workspace for a fast algorithm */
3218 i__3 = wrkbl, i__2 = *lda * *n + *m;
3219 if (*lwork >= f2cmax(i__3,i__2) + *lda * *m) {
3221 /* WORK(IU) is LDA by N and WORK(IR) is LDA by M */
3226 } else /* if(complicated condition) */ {
3228 i__3 = wrkbl, i__2 = *lda * *n + *m;
3229 if (*lwork >= f2cmax(i__3,i__2) + *m * *m) {
3231 /* WORK(IU) is LDA by N and WORK(IR) is M by M */
3238 /* WORK(IU) is M by CHUNK and WORK(IR) is M by M */
3241 chunk = (*lwork - *m * *m - *m) / *m;
3245 itau = ir + ldwrkr * *m;
3249 /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */
3251 i__3 = *lwork - iwork + 1;
3252 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork]
3255 /* Copy L to U, zeroing about above it */
3257 dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu);
3260 dlaset_("U", &i__3, &i__2, &c_b57, &c_b57, &u[(u_dim1 <<
3263 /* Generate Q in A */
3264 /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */
3266 i__3 = *lwork - iwork + 1;
3267 dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[
3268 iwork], &i__3, &ierr);
3274 /* Bidiagonalize L in U, copying result to WORK(IR) */
3275 /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */
3277 i__3 = *lwork - iwork + 1;
3278 dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[
3279 itauq], &work[itaup], &work[iwork], &i__3, &ierr);
3280 dlacpy_("U", m, m, &u[u_offset], ldu, &work[ir], &ldwrkr);
3282 /* Generate right vectors bidiagonalizing L in WORK(IR) */
3283 /* (Workspace: need M*M + 4*M-1, prefer M*M + 3*M + (M-1)*NB) */
3285 i__3 = *lwork - iwork + 1;
3286 dorgbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup], &
3287 work[iwork], &i__3, &ierr);
3289 /* Generate left vectors bidiagonalizing L in U */
3290 /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) */
3292 i__3 = *lwork - iwork + 1;
3293 dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], &
3294 work[iwork], &i__3, &ierr);
3297 /* Perform bidiagonal QR iteration, computing left */
3298 /* singular vectors of L in U, and computing right */
3299 /* singular vectors of L in WORK(IR) */
3300 /* (Workspace: need M*M + BDSPAC) */
3302 dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[ir],
3303 &ldwrkr, &u[u_offset], ldu, dum, &c__1, &work[
3307 /* Multiply right singular vectors of L in WORK(IR) by Q */
3308 /* in A, storing result in WORK(IU) and copying to A */
3309 /* (Workspace: need M*M + 2*M, prefer M*M + M*N + M)) */
3313 for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ +=
3316 i__4 = *n - i__ + 1;
3317 blk = f2cmin(i__4,chunk);
3318 dgemm_("N", "N", m, &blk, m, &c_b79, &work[ir], &
3319 ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b57, &
3321 dlacpy_("F", m, &blk, &work[iu], &ldwrku, &a[i__ *
3328 /* Insufficient workspace for a fast algorithm */
3334 /* (Workspace: need 2*M, prefer M + M*NB) */
3336 i__2 = *lwork - iwork + 1;
3337 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork]
3340 /* Copy L to U, zeroing out above it */
3342 dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu);
3345 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 <<
3348 /* Generate Q in A */
3349 /* (Workspace: need 2*M, prefer M + M*NB) */
3351 i__2 = *lwork - iwork + 1;
3352 dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[
3353 iwork], &i__2, &ierr);
3359 /* Bidiagonalize L in U */
3360 /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */
3362 i__2 = *lwork - iwork + 1;
3363 dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[
3364 itauq], &work[itaup], &work[iwork], &i__2, &ierr);
3366 /* Multiply right vectors bidiagonalizing L by Q in A */
3367 /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */
3369 i__2 = *lwork - iwork + 1;
3370 dormbr_("P", "L", "T", m, n, m, &u[u_offset], ldu, &work[
3371 itaup], &a[a_offset], lda, &work[iwork], &i__2, &
3374 /* Generate left vectors bidiagonalizing L in U */
3375 /* (Workspace: need 4*M, prefer 3*M + M*NB) */
3377 i__2 = *lwork - iwork + 1;
3378 dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], &
3379 work[iwork], &i__2, &ierr);
3382 /* Perform bidiagonal QR iteration, computing left */
3383 /* singular vectors of A in U and computing right */
3384 /* singular vectors of A in A */
3385 /* (Workspace: need BDSPAC) */
3387 dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &a[
3388 a_offset], lda, &u[u_offset], ldu, dum, &c__1, &
3397 /* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */
3398 /* M right singular vectors to be computed in VT and */
3399 /* no left singular vectors to be computed */
3403 if (*lwork >= *m * *m + f2cmax(i__2,bdspac)) {
3405 /* Sufficient workspace for a fast algorithm */
3408 if (*lwork >= wrkbl + *lda * *m) {
3410 /* WORK(IR) is LDA by M */
3415 /* WORK(IR) is M by M */
3419 itau = ir + ldwrkr * *m;
3423 /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */
3425 i__2 = *lwork - iwork + 1;
3426 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3427 iwork], &i__2, &ierr);
3429 /* Copy L to WORK(IR), zeroing out above it */
3431 dlacpy_("L", m, m, &a[a_offset], lda, &work[ir], &
3435 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &work[ir +
3438 /* Generate Q in A */
3439 /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */
3441 i__2 = *lwork - iwork + 1;
3442 dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &
3443 work[iwork], &i__2, &ierr);
3449 /* Bidiagonalize L in WORK(IR) */
3450 /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */
3452 i__2 = *lwork - iwork + 1;
3453 dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], &
3454 work[itauq], &work[itaup], &work[iwork], &
3457 /* Generate right vectors bidiagonalizing L in */
3459 /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + (M-1)*NB) */
3461 i__2 = *lwork - iwork + 1;
3462 dorgbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup]
3463 , &work[iwork], &i__2, &ierr);
3466 /* Perform bidiagonal QR iteration, computing right */
3467 /* singular vectors of L in WORK(IR) */
3468 /* (Workspace: need M*M + BDSPAC) */
3470 dbdsqr_("U", m, m, &c__0, &c__0, &s[1], &work[ie], &
3471 work[ir], &ldwrkr, dum, &c__1, dum, &c__1, &
3474 /* Multiply right singular vectors of L in WORK(IR) by */
3475 /* Q in A, storing result in VT */
3476 /* (Workspace: need M*M) */
3478 dgemm_("N", "N", m, n, m, &c_b79, &work[ir], &ldwrkr,
3479 &a[a_offset], lda, &c_b57, &vt[vt_offset],
3484 /* Insufficient workspace for a fast algorithm */
3490 /* (Workspace: need 2*M, prefer M + M*NB) */
3492 i__2 = *lwork - iwork + 1;
3493 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3494 iwork], &i__2, &ierr);
3496 /* Copy result to VT */
3498 dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
3501 /* Generate Q in VT */
3502 /* (Workspace: need 2*M, prefer M + M*NB) */
3504 i__2 = *lwork - iwork + 1;
3505 dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], &
3506 work[iwork], &i__2, &ierr);
3512 /* Zero out above L in A */
3516 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1
3519 /* Bidiagonalize L in A */
3520 /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */
3522 i__2 = *lwork - iwork + 1;
3523 dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &
3524 work[itauq], &work[itaup], &work[iwork], &
3527 /* Multiply right vectors bidiagonalizing L by Q in VT */
3528 /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */
3530 i__2 = *lwork - iwork + 1;
3531 dormbr_("P", "L", "T", m, n, m, &a[a_offset], lda, &
3532 work[itaup], &vt[vt_offset], ldvt, &work[
3533 iwork], &i__2, &ierr);
3536 /* Perform bidiagonal QR iteration, computing right */
3537 /* singular vectors of A in VT */
3538 /* (Workspace: need BDSPAC) */
3540 dbdsqr_("U", m, n, &c__0, &c__0, &s[1], &work[ie], &
3541 vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, &
3548 /* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */
3549 /* M right singular vectors to be computed in VT and */
3550 /* M left singular vectors to be overwritten on A */
3554 if (*lwork >= (*m << 1) * *m + f2cmax(i__2,bdspac)) {
3556 /* Sufficient workspace for a fast algorithm */
3559 if (*lwork >= wrkbl + (*lda << 1) * *m) {
3561 /* WORK(IU) is LDA by M and WORK(IR) is LDA by M */
3564 ir = iu + ldwrku * *m;
3566 } else if (*lwork >= wrkbl + (*lda + *m) * *m) {
3568 /* WORK(IU) is LDA by M and WORK(IR) is M by M */
3571 ir = iu + ldwrku * *m;
3575 /* WORK(IU) is M by M and WORK(IR) is M by M */
3578 ir = iu + ldwrku * *m;
3581 itau = ir + ldwrkr * *m;
3585 /* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) */
3587 i__2 = *lwork - iwork + 1;
3588 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3589 iwork], &i__2, &ierr);
3591 /* Copy L to WORK(IU), zeroing out below it */
3593 dlacpy_("L", m, m, &a[a_offset], lda, &work[iu], &
3597 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &work[iu +
3600 /* Generate Q in A */
3601 /* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) */
3603 i__2 = *lwork - iwork + 1;
3604 dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &
3605 work[iwork], &i__2, &ierr);
3611 /* Bidiagonalize L in WORK(IU), copying result to */
3613 /* (Workspace: need 2*M*M + 4*M, */
3614 /* prefer 2*M*M+3*M+2*M*NB) */
3616 i__2 = *lwork - iwork + 1;
3617 dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], &
3618 work[itauq], &work[itaup], &work[iwork], &
3620 dlacpy_("L", m, m, &work[iu], &ldwrku, &work[ir], &
3623 /* Generate right bidiagonalizing vectors in WORK(IU) */
3624 /* (Workspace: need 2*M*M + 4*M-1, */
3625 /* prefer 2*M*M+3*M+(M-1)*NB) */
3627 i__2 = *lwork - iwork + 1;
3628 dorgbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup]
3629 , &work[iwork], &i__2, &ierr);
3631 /* Generate left bidiagonalizing vectors in WORK(IR) */
3632 /* (Workspace: need 2*M*M + 4*M, prefer 2*M*M + 3*M + M*NB) */
3634 i__2 = *lwork - iwork + 1;
3635 dorgbr_("Q", m, m, m, &work[ir], &ldwrkr, &work[itauq]
3636 , &work[iwork], &i__2, &ierr);
3639 /* Perform bidiagonal QR iteration, computing left */
3640 /* singular vectors of L in WORK(IR) and computing */
3641 /* right singular vectors of L in WORK(IU) */
3642 /* (Workspace: need 2*M*M + BDSPAC) */
3644 dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[
3645 iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1,
3646 &work[iwork], info);
3648 /* Multiply right singular vectors of L in WORK(IU) by */
3649 /* Q in A, storing result in VT */
3650 /* (Workspace: need M*M) */
3652 dgemm_("N", "N", m, n, m, &c_b79, &work[iu], &ldwrku,
3653 &a[a_offset], lda, &c_b57, &vt[vt_offset],
3656 /* Copy left singular vectors of L to A */
3657 /* (Workspace: need M*M) */
3659 dlacpy_("F", m, m, &work[ir], &ldwrkr, &a[a_offset],
3664 /* Insufficient workspace for a fast algorithm */
3669 /* Compute A=L*Q, copying result to VT */
3670 /* (Workspace: need 2*M, prefer M + M*NB) */
3672 i__2 = *lwork - iwork + 1;
3673 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3674 iwork], &i__2, &ierr);
3675 dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
3678 /* Generate Q in VT */
3679 /* (Workspace: need 2*M, prefer M + M*NB) */
3681 i__2 = *lwork - iwork + 1;
3682 dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], &
3683 work[iwork], &i__2, &ierr);
3689 /* Zero out above L in A */
3693 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1
3696 /* Bidiagonalize L in A */
3697 /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */
3699 i__2 = *lwork - iwork + 1;
3700 dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &
3701 work[itauq], &work[itaup], &work[iwork], &
3704 /* Multiply right vectors bidiagonalizing L by Q in VT */
3705 /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */
3707 i__2 = *lwork - iwork + 1;
3708 dormbr_("P", "L", "T", m, n, m, &a[a_offset], lda, &
3709 work[itaup], &vt[vt_offset], ldvt, &work[
3710 iwork], &i__2, &ierr);
3712 /* Generate left bidiagonalizing vectors of L in A */
3713 /* (Workspace: need 4*M, prefer 3*M + M*NB) */
3715 i__2 = *lwork - iwork + 1;
3716 dorgbr_("Q", m, m, m, &a[a_offset], lda, &work[itauq],
3717 &work[iwork], &i__2, &ierr);
3720 /* Perform bidiagonal QR iteration, compute left */
3721 /* singular vectors of A in A and compute right */
3722 /* singular vectors of A in VT */
3723 /* (Workspace: need BDSPAC) */
3725 dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &vt[
3726 vt_offset], ldvt, &a[a_offset], lda, dum, &
3727 c__1, &work[iwork], info);
3731 } else if (wntuas) {
3733 /* Path 6t(N much larger than M, JOBU='S' or 'A', */
3735 /* M right singular vectors to be computed in VT and */
3736 /* M left singular vectors to be computed in U */
3740 if (*lwork >= *m * *m + f2cmax(i__2,bdspac)) {
3742 /* Sufficient workspace for a fast algorithm */
3745 if (*lwork >= wrkbl + *lda * *m) {
3747 /* WORK(IU) is LDA by N */
3752 /* WORK(IU) is LDA by M */
3756 itau = iu + ldwrku * *m;
3760 /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */
3762 i__2 = *lwork - iwork + 1;
3763 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3764 iwork], &i__2, &ierr);
3766 /* Copy L to WORK(IU), zeroing out above it */
3768 dlacpy_("L", m, m, &a[a_offset], lda, &work[iu], &
3772 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &work[iu +
3775 /* Generate Q in A */
3776 /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */
3778 i__2 = *lwork - iwork + 1;
3779 dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &
3780 work[iwork], &i__2, &ierr);
3786 /* Bidiagonalize L in WORK(IU), copying result to U */
3787 /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */
3789 i__2 = *lwork - iwork + 1;
3790 dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], &
3791 work[itauq], &work[itaup], &work[iwork], &
3793 dlacpy_("L", m, m, &work[iu], &ldwrku, &u[u_offset],
3796 /* Generate right bidiagonalizing vectors in WORK(IU) */
3797 /* (Workspace: need M*M + 4*M-1, */
3798 /* prefer M*M+3*M+(M-1)*NB) */
3800 i__2 = *lwork - iwork + 1;
3801 dorgbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup]
3802 , &work[iwork], &i__2, &ierr);
3804 /* Generate left bidiagonalizing vectors in U */
3805 /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) */
3807 i__2 = *lwork - iwork + 1;
3808 dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq],
3809 &work[iwork], &i__2, &ierr);
3812 /* Perform bidiagonal QR iteration, computing left */
3813 /* singular vectors of L in U and computing right */
3814 /* singular vectors of L in WORK(IU) */
3815 /* (Workspace: need M*M + BDSPAC) */
3817 dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[
3818 iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, &
3821 /* Multiply right singular vectors of L in WORK(IU) by */
3822 /* Q in A, storing result in VT */
3823 /* (Workspace: need M*M) */
3825 dgemm_("N", "N", m, n, m, &c_b79, &work[iu], &ldwrku,
3826 &a[a_offset], lda, &c_b57, &vt[vt_offset],
3831 /* Insufficient workspace for a fast algorithm */
3836 /* Compute A=L*Q, copying result to VT */
3837 /* (Workspace: need 2*M, prefer M + M*NB) */
3839 i__2 = *lwork - iwork + 1;
3840 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3841 iwork], &i__2, &ierr);
3842 dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
3845 /* Generate Q in VT */
3846 /* (Workspace: need 2*M, prefer M + M*NB) */
3848 i__2 = *lwork - iwork + 1;
3849 dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], &
3850 work[iwork], &i__2, &ierr);
3852 /* Copy L to U, zeroing out above it */
3854 dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset],
3858 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1
3865 /* Bidiagonalize L in U */
3866 /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */
3868 i__2 = *lwork - iwork + 1;
3869 dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &
3870 work[itauq], &work[itaup], &work[iwork], &
3873 /* Multiply right bidiagonalizing vectors in U by Q */
3875 /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */
3877 i__2 = *lwork - iwork + 1;
3878 dormbr_("P", "L", "T", m, n, m, &u[u_offset], ldu, &
3879 work[itaup], &vt[vt_offset], ldvt, &work[
3880 iwork], &i__2, &ierr);
3882 /* Generate left bidiagonalizing vectors in U */
3883 /* (Workspace: need 4*M, prefer 3*M + M*NB) */
3885 i__2 = *lwork - iwork + 1;
3886 dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq],
3887 &work[iwork], &i__2, &ierr);
3890 /* Perform bidiagonal QR iteration, computing left */
3891 /* singular vectors of A in U and computing right */
3892 /* singular vectors of A in VT */
3893 /* (Workspace: need BDSPAC) */
3895 dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &vt[
3896 vt_offset], ldvt, &u[u_offset], ldu, dum, &
3897 c__1, &work[iwork], info);
3907 /* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */
3908 /* N right singular vectors to be computed in VT and */
3909 /* no left singular vectors to be computed */
3912 i__2 = *n + *m, i__3 = *m << 2, i__2 = f2cmax(i__2,i__3);
3913 if (*lwork >= *m * *m + f2cmax(i__2,bdspac)) {
3915 /* Sufficient workspace for a fast algorithm */
3918 if (*lwork >= wrkbl + *lda * *m) {
3920 /* WORK(IR) is LDA by M */
3925 /* WORK(IR) is M by M */
3929 itau = ir + ldwrkr * *m;
3932 /* Compute A=L*Q, copying result to VT */
3933 /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */
3935 i__2 = *lwork - iwork + 1;
3936 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3937 iwork], &i__2, &ierr);
3938 dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
3941 /* Copy L to WORK(IR), zeroing out above it */
3943 dlacpy_("L", m, m, &a[a_offset], lda, &work[ir], &
3947 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &work[ir +
3950 /* Generate Q in VT */
3951 /* (Workspace: need M*M + M + N, prefer M*M + M + N*NB) */
3953 i__2 = *lwork - iwork + 1;
3954 dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &
3955 work[iwork], &i__2, &ierr);
3961 /* Bidiagonalize L in WORK(IR) */
3962 /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */
3964 i__2 = *lwork - iwork + 1;
3965 dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], &
3966 work[itauq], &work[itaup], &work[iwork], &
3969 /* Generate right bidiagonalizing vectors in WORK(IR) */
3970 /* (Workspace: need M*M + 4*M-1, */
3971 /* prefer M*M+3*M+(M-1)*NB) */
3973 i__2 = *lwork - iwork + 1;
3974 dorgbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup]
3975 , &work[iwork], &i__2, &ierr);
3978 /* Perform bidiagonal QR iteration, computing right */
3979 /* singular vectors of L in WORK(IR) */
3980 /* (Workspace: need M*M + BDSPAC) */
3982 dbdsqr_("U", m, m, &c__0, &c__0, &s[1], &work[ie], &
3983 work[ir], &ldwrkr, dum, &c__1, dum, &c__1, &
3986 /* Multiply right singular vectors of L in WORK(IR) by */
3987 /* Q in VT, storing result in A */
3988 /* (Workspace: need M*M) */
3990 dgemm_("N", "N", m, n, m, &c_b79, &work[ir], &ldwrkr,
3991 &vt[vt_offset], ldvt, &c_b57, &a[a_offset],
3994 /* Copy right singular vectors of A from A to VT */
3996 dlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset],
4001 /* Insufficient workspace for a fast algorithm */
4006 /* Compute A=L*Q, copying result to VT */
4007 /* (Workspace: need 2*M, prefer M + M*NB) */
4009 i__2 = *lwork - iwork + 1;
4010 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
4011 iwork], &i__2, &ierr);
4012 dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
4015 /* Generate Q in VT */
4016 /* (Workspace: need M + N, prefer M + N*NB) */
4018 i__2 = *lwork - iwork + 1;
4019 dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &
4020 work[iwork], &i__2, &ierr);
4026 /* Zero out above L in A */
4030 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1
4033 /* Bidiagonalize L in A */
4034 /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */
4036 i__2 = *lwork - iwork + 1;
4037 dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &
4038 work[itauq], &work[itaup], &work[iwork], &
4041 /* Multiply right bidiagonalizing vectors in A by Q */
4043 /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */
4045 i__2 = *lwork - iwork + 1;
4046 dormbr_("P", "L", "T", m, n, m, &a[a_offset], lda, &
4047 work[itaup], &vt[vt_offset], ldvt, &work[
4048 iwork], &i__2, &ierr);
4051 /* Perform bidiagonal QR iteration, computing right */
4052 /* singular vectors of A in VT */
4053 /* (Workspace: need BDSPAC) */
4055 dbdsqr_("U", m, n, &c__0, &c__0, &s[1], &work[ie], &
4056 vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, &
4063 /* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */
4064 /* N right singular vectors to be computed in VT and */
4065 /* M left singular vectors to be overwritten on A */
4068 i__2 = *n + *m, i__3 = *m << 2, i__2 = f2cmax(i__2,i__3);
4069 if (*lwork >= (*m << 1) * *m + f2cmax(i__2,bdspac)) {
4071 /* Sufficient workspace for a fast algorithm */
4074 if (*lwork >= wrkbl + (*lda << 1) * *m) {
4076 /* WORK(IU) is LDA by M and WORK(IR) is LDA by M */
4079 ir = iu + ldwrku * *m;
4081 } else if (*lwork >= wrkbl + (*lda + *m) * *m) {
4083 /* WORK(IU) is LDA by M and WORK(IR) is M by M */
4086 ir = iu + ldwrku * *m;
4090 /* WORK(IU) is M by M and WORK(IR) is M by M */
4093 ir = iu + ldwrku * *m;
4096 itau = ir + ldwrkr * *m;
4099 /* Compute A=L*Q, copying result to VT */
4100 /* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) */
4102 i__2 = *lwork - iwork + 1;
4103 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
4104 iwork], &i__2, &ierr);
4105 dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
4108 /* Generate Q in VT */
4109 /* (Workspace: need 2*M*M + M + N, prefer 2*M*M + M + N*NB) */
4111 i__2 = *lwork - iwork + 1;
4112 dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &
4113 work[iwork], &i__2, &ierr);
4115 /* Copy L to WORK(IU), zeroing out above it */
4117 dlacpy_("L", m, m, &a[a_offset], lda, &work[iu], &
4121 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &work[iu +
4128 /* Bidiagonalize L in WORK(IU), copying result to */
4130 /* (Workspace: need 2*M*M + 4*M, */
4131 /* prefer 2*M*M+3*M+2*M*NB) */
4133 i__2 = *lwork - iwork + 1;
4134 dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], &
4135 work[itauq], &work[itaup], &work[iwork], &
4137 dlacpy_("L", m, m, &work[iu], &ldwrku, &work[ir], &
4140 /* Generate right bidiagonalizing vectors in WORK(IU) */
4141 /* (Workspace: need 2*M*M + 4*M-1, */
4142 /* prefer 2*M*M+3*M+(M-1)*NB) */
4144 i__2 = *lwork - iwork + 1;
4145 dorgbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup]
4146 , &work[iwork], &i__2, &ierr);
4148 /* Generate left bidiagonalizing vectors in WORK(IR) */
4149 /* (Workspace: need 2*M*M + 4*M, prefer 2*M*M + 3*M + M*NB) */
4151 i__2 = *lwork - iwork + 1;
4152 dorgbr_("Q", m, m, m, &work[ir], &ldwrkr, &work[itauq]
4153 , &work[iwork], &i__2, &ierr);
4156 /* Perform bidiagonal QR iteration, computing left */
4157 /* singular vectors of L in WORK(IR) and computing */
4158 /* right singular vectors of L in WORK(IU) */
4159 /* (Workspace: need 2*M*M + BDSPAC) */
4161 dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[
4162 iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1,
4163 &work[iwork], info);
4165 /* Multiply right singular vectors of L in WORK(IU) by */
4166 /* Q in VT, storing result in A */
4167 /* (Workspace: need M*M) */
4169 dgemm_("N", "N", m, n, m, &c_b79, &work[iu], &ldwrku,
4170 &vt[vt_offset], ldvt, &c_b57, &a[a_offset],
4173 /* Copy right singular vectors of A from A to VT */
4175 dlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset],
4178 /* Copy left singular vectors of A from WORK(IR) to A */
4180 dlacpy_("F", m, m, &work[ir], &ldwrkr, &a[a_offset],
4185 /* Insufficient workspace for a fast algorithm */
4190 /* Compute A=L*Q, copying result to VT */
4191 /* (Workspace: need 2*M, prefer M + M*NB) */
4193 i__2 = *lwork - iwork + 1;
4194 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
4195 iwork], &i__2, &ierr);
4196 dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
4199 /* Generate Q in VT */
4200 /* (Workspace: need M + N, prefer M + N*NB) */
4202 i__2 = *lwork - iwork + 1;
4203 dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &
4204 work[iwork], &i__2, &ierr);
4210 /* Zero out above L in A */
4214 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1
4217 /* Bidiagonalize L in A */
4218 /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */
4220 i__2 = *lwork - iwork + 1;
4221 dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &
4222 work[itauq], &work[itaup], &work[iwork], &
4225 /* Multiply right bidiagonalizing vectors in A by Q */
4227 /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */
4229 i__2 = *lwork - iwork + 1;
4230 dormbr_("P", "L", "T", m, n, m, &a[a_offset], lda, &
4231 work[itaup], &vt[vt_offset], ldvt, &work[
4232 iwork], &i__2, &ierr);
4234 /* Generate left bidiagonalizing vectors in A */
4235 /* (Workspace: need 4*M, prefer 3*M + M*NB) */
4237 i__2 = *lwork - iwork + 1;
4238 dorgbr_("Q", m, m, m, &a[a_offset], lda, &work[itauq],
4239 &work[iwork], &i__2, &ierr);
4242 /* Perform bidiagonal QR iteration, computing left */
4243 /* singular vectors of A in A and computing right */
4244 /* singular vectors of A in VT */
4245 /* (Workspace: need BDSPAC) */
4247 dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &vt[
4248 vt_offset], ldvt, &a[a_offset], lda, dum, &
4249 c__1, &work[iwork], info);
4253 } else if (wntuas) {
4255 /* Path 9t(N much larger than M, JOBU='S' or 'A', */
4257 /* N right singular vectors to be computed in VT and */
4258 /* M left singular vectors to be computed in U */
4261 i__2 = *n + *m, i__3 = *m << 2, i__2 = f2cmax(i__2,i__3);
4262 if (*lwork >= *m * *m + f2cmax(i__2,bdspac)) {
4264 /* Sufficient workspace for a fast algorithm */
4267 if (*lwork >= wrkbl + *lda * *m) {
4269 /* WORK(IU) is LDA by M */
4274 /* WORK(IU) is M by M */
4278 itau = iu + ldwrku * *m;
4281 /* Compute A=L*Q, copying result to VT */
4282 /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */
4284 i__2 = *lwork - iwork + 1;
4285 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
4286 iwork], &i__2, &ierr);
4287 dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
4290 /* Generate Q in VT */
4291 /* (Workspace: need M*M + M + N, prefer M*M + M + N*NB) */
4293 i__2 = *lwork - iwork + 1;
4294 dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &
4295 work[iwork], &i__2, &ierr);
4297 /* Copy L to WORK(IU), zeroing out above it */
4299 dlacpy_("L", m, m, &a[a_offset], lda, &work[iu], &
4303 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &work[iu +
4310 /* Bidiagonalize L in WORK(IU), copying result to U */
4311 /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */
4313 i__2 = *lwork - iwork + 1;
4314 dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], &
4315 work[itauq], &work[itaup], &work[iwork], &
4317 dlacpy_("L", m, m, &work[iu], &ldwrku, &u[u_offset],
4320 /* Generate right bidiagonalizing vectors in WORK(IU) */
4321 /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + (M-1)*NB) */
4323 i__2 = *lwork - iwork + 1;
4324 dorgbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup]
4325 , &work[iwork], &i__2, &ierr);
4327 /* Generate left bidiagonalizing vectors in U */
4328 /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) */
4330 i__2 = *lwork - iwork + 1;
4331 dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq],
4332 &work[iwork], &i__2, &ierr);
4335 /* Perform bidiagonal QR iteration, computing left */
4336 /* singular vectors of L in U and computing right */
4337 /* singular vectors of L in WORK(IU) */
4338 /* (Workspace: need M*M + BDSPAC) */
4340 dbdsqr_("U", m, m, m, &c__0, &s[1], &work[ie], &work[
4341 iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, &
4344 /* Multiply right singular vectors of L in WORK(IU) by */
4345 /* Q in VT, storing result in A */
4346 /* (Workspace: need M*M) */
4348 dgemm_("N", "N", m, n, m, &c_b79, &work[iu], &ldwrku,
4349 &vt[vt_offset], ldvt, &c_b57, &a[a_offset],
4352 /* Copy right singular vectors of A from A to VT */
4354 dlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset],
4359 /* Insufficient workspace for a fast algorithm */
4364 /* Compute A=L*Q, copying result to VT */
4365 /* (Workspace: need 2*M, prefer M + M*NB) */
4367 i__2 = *lwork - iwork + 1;
4368 dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
4369 iwork], &i__2, &ierr);
4370 dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
4373 /* Generate Q in VT */
4374 /* (Workspace: need M + N, prefer M + N*NB) */
4376 i__2 = *lwork - iwork + 1;
4377 dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &
4378 work[iwork], &i__2, &ierr);
4380 /* Copy L to U, zeroing out above it */
4382 dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset],
4386 dlaset_("U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1
4393 /* Bidiagonalize L in U */
4394 /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */
4396 i__2 = *lwork - iwork + 1;
4397 dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &
4398 work[itauq], &work[itaup], &work[iwork], &
4401 /* Multiply right bidiagonalizing vectors in U by Q */
4403 /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */
4405 i__2 = *lwork - iwork + 1;
4406 dormbr_("P", "L", "T", m, n, m, &u[u_offset], ldu, &
4407 work[itaup], &vt[vt_offset], ldvt, &work[
4408 iwork], &i__2, &ierr);
4410 /* Generate left bidiagonalizing vectors in U */
4411 /* (Workspace: need 4*M, prefer 3*M + M*NB) */
4413 i__2 = *lwork - iwork + 1;
4414 dorgbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq],
4415 &work[iwork], &i__2, &ierr);
4418 /* Perform bidiagonal QR iteration, computing left */
4419 /* singular vectors of A in U and computing right */
4420 /* singular vectors of A in VT */
4421 /* (Workspace: need BDSPAC) */
4423 dbdsqr_("U", m, n, m, &c__0, &s[1], &work[ie], &vt[
4424 vt_offset], ldvt, &u[u_offset], ldu, dum, &
4425 c__1, &work[iwork], info);
4437 /* Path 10t(N greater than M, but not much larger) */
4438 /* Reduce to bidiagonal form without LQ decomposition */
4445 /* Bidiagonalize A */
4446 /* (Workspace: need 3*M + N, prefer 3*M + (M + N)*NB) */
4448 i__2 = *lwork - iwork + 1;
4449 dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &
4450 work[itaup], &work[iwork], &i__2, &ierr);
4453 /* If left singular vectors desired in U, copy result to U */
4454 /* and generate left bidiagonalizing vectors in U */
4455 /* (Workspace: need 4*M-1, prefer 3*M + (M-1)*NB) */
4457 dlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu);
4458 i__2 = *lwork - iwork + 1;
4459 dorgbr_("Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[
4460 iwork], &i__2, &ierr);
4464 /* If right singular vectors desired in VT, copy result to */
4465 /* VT and generate right bidiagonalizing vectors in VT */
4466 /* (Workspace: need 3*M + NRVT, prefer 3*M + NRVT*NB) */
4468 dlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
4475 i__2 = *lwork - iwork + 1;
4476 dorgbr_("P", &nrvt, n, m, &vt[vt_offset], ldvt, &work[itaup],
4477 &work[iwork], &i__2, &ierr);
4481 /* If left singular vectors desired in A, generate left */
4482 /* bidiagonalizing vectors in A */
4483 /* (Workspace: need 4*M-1, prefer 3*M + (M-1)*NB) */
4485 i__2 = *lwork - iwork + 1;
4486 dorgbr_("Q", m, m, n, &a[a_offset], lda, &work[itauq], &work[
4487 iwork], &i__2, &ierr);
4491 /* If right singular vectors desired in A, generate right */
4492 /* bidiagonalizing vectors in A */
4493 /* (Workspace: need 4*M, prefer 3*M + M*NB) */
4495 i__2 = *lwork - iwork + 1;
4496 dorgbr_("P", m, n, m, &a[a_offset], lda, &work[itaup], &work[
4497 iwork], &i__2, &ierr);
4500 if (wntuas || wntuo) {
4506 if (wntvas || wntvo) {
4512 if (! wntuo && ! wntvo) {
4514 /* Perform bidiagonal QR iteration, if desired, computing */
4515 /* left singular vectors in U and computing right singular */
4517 /* (Workspace: need BDSPAC) */
4519 dbdsqr_("L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[
4520 vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, &
4522 } else if (! wntuo && wntvo) {
4524 /* Perform bidiagonal QR iteration, if desired, computing */
4525 /* left singular vectors in U and computing right singular */
4527 /* (Workspace: need BDSPAC) */
4529 dbdsqr_("L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[
4530 a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[
4534 /* Perform bidiagonal QR iteration, if desired, computing */
4535 /* left singular vectors in A and computing right singular */
4537 /* (Workspace: need BDSPAC) */
4539 dbdsqr_("L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[
4540 vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, &
4548 /* If DBDSQR failed to converge, copy unconverged superdiagonals */
4549 /* to WORK( 2:MINMN ) */
4554 for (i__ = 1; i__ <= i__2; ++i__) {
4555 work[i__ + 1] = work[i__ + ie - 1];
4560 for (i__ = minmn - 1; i__ >= 1; --i__) {
4561 work[i__ + 1] = work[i__ + ie - 1];
4567 /* Undo scaling if necessary */
4570 if (anrm > bignum) {
4571 dlascl_("G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], &
4574 if (*info != 0 && anrm > bignum) {
4576 dlascl_("G", &c__0, &c__0, &bignum, &anrm, &i__2, &c__1, &work[2],
4579 if (anrm < smlnum) {
4580 dlascl_("G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], &
4583 if (*info != 0 && anrm < smlnum) {
4585 dlascl_("G", &c__0, &c__0, &smlnum, &anrm, &i__2, &c__1, &work[2],
4590 /* Return optimal workspace in WORK(1) */
4592 work[1] = (doublereal) maxwrk;