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 complex c_b1 = {0.f,0.f};
516 static complex c_b2 = {1.f,0.f};
517 static integer c__6 = 6;
518 static integer c__0 = 0;
519 static integer c__2 = 2;
520 static integer c_n1 = -1;
521 static integer c__1 = 1;
523 /* > \brief <b> CGESVD 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 CGESVD + dependencies */
532 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cgesvd.
535 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cgesvd.
538 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cgesvd.
546 /* SUBROUTINE CGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT, */
547 /* WORK, LWORK, RWORK, INFO ) */
549 /* CHARACTER JOBU, JOBVT */
550 /* INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N */
551 /* REAL RWORK( * ), S( * ) */
552 /* COMPLEX A( LDA, * ), U( LDU, * ), VT( LDVT, * ), */
556 /* > \par Purpose: */
561 /* > CGESVD computes the singular value decomposition (SVD) of a complex */
562 /* > M-by-N matrix A, optionally computing the left and/or right singular */
563 /* > vectors. The SVD is written */
565 /* > A = U * SIGMA * conjugate-transpose(V) */
567 /* > where SIGMA is an M-by-N matrix which is zero except for its */
568 /* > f2cmin(m,n) diagonal elements, U is an M-by-M unitary matrix, and */
569 /* > V is an N-by-N unitary matrix. The diagonal elements of SIGMA */
570 /* > are the singular values of A; they are real and non-negative, and */
571 /* > are returned in descending order. The first f2cmin(m,n) columns of */
572 /* > U and V are the left and right singular vectors of A. */
574 /* > Note that the routine returns V**H, not V. */
580 /* > \param[in] JOBU */
582 /* > JOBU is CHARACTER*1 */
583 /* > Specifies options for computing all or part of the matrix U: */
584 /* > = 'A': all M columns of U are returned in array U: */
585 /* > = 'S': the first f2cmin(m,n) columns of U (the left singular */
586 /* > vectors) are returned in the array U; */
587 /* > = 'O': the first f2cmin(m,n) columns of U (the left singular */
588 /* > vectors) are overwritten on the array A; */
589 /* > = 'N': no columns of U (no left singular vectors) are */
593 /* > \param[in] JOBVT */
595 /* > JOBVT is CHARACTER*1 */
596 /* > Specifies options for computing all or part of the matrix */
598 /* > = 'A': all N rows of V**H are returned in the array VT; */
599 /* > = 'S': the first f2cmin(m,n) rows of V**H (the right singular */
600 /* > vectors) are returned in the array VT; */
601 /* > = 'O': the first f2cmin(m,n) rows of V**H (the right singular */
602 /* > vectors) are overwritten on the array A; */
603 /* > = 'N': no rows of V**H (no right singular vectors) are */
606 /* > JOBVT and JOBU cannot both be 'O'. */
612 /* > The number of rows of the input matrix A. M >= 0. */
618 /* > The number of columns of the input matrix A. N >= 0. */
621 /* > \param[in,out] A */
623 /* > A is COMPLEX array, dimension (LDA,N) */
624 /* > On entry, the M-by-N matrix A. */
626 /* > if JOBU = 'O', A is overwritten with the first f2cmin(m,n) */
627 /* > columns of U (the left singular vectors, */
628 /* > stored columnwise); */
629 /* > if JOBVT = 'O', A is overwritten with the first f2cmin(m,n) */
630 /* > rows of V**H (the right singular vectors, */
631 /* > stored rowwise); */
632 /* > if JOBU .ne. 'O' and JOBVT .ne. 'O', the contents of A */
633 /* > are destroyed. */
636 /* > \param[in] LDA */
638 /* > LDA is INTEGER */
639 /* > The leading dimension of the array A. LDA >= f2cmax(1,M). */
642 /* > \param[out] S */
644 /* > S is REAL array, dimension (f2cmin(M,N)) */
645 /* > The singular values of A, sorted so that S(i) >= S(i+1). */
648 /* > \param[out] U */
650 /* > U is COMPLEX array, dimension (LDU,UCOL) */
651 /* > (LDU,M) if JOBU = 'A' or (LDU,f2cmin(M,N)) if JOBU = 'S'. */
652 /* > If JOBU = 'A', U contains the M-by-M unitary matrix U; */
653 /* > if JOBU = 'S', U contains the first f2cmin(m,n) columns of U */
654 /* > (the left singular vectors, stored columnwise); */
655 /* > if JOBU = 'N' or 'O', U is not referenced. */
658 /* > \param[in] LDU */
660 /* > LDU is INTEGER */
661 /* > The leading dimension of the array U. LDU >= 1; if */
662 /* > JOBU = 'S' or 'A', LDU >= M. */
665 /* > \param[out] VT */
667 /* > VT is COMPLEX array, dimension (LDVT,N) */
668 /* > If JOBVT = 'A', VT contains the N-by-N unitary matrix */
670 /* > if JOBVT = 'S', VT contains the first f2cmin(m,n) rows of */
671 /* > V**H (the right singular vectors, stored rowwise); */
672 /* > if JOBVT = 'N' or 'O', VT is not referenced. */
675 /* > \param[in] LDVT */
677 /* > LDVT is INTEGER */
678 /* > The leading dimension of the array VT. LDVT >= 1; if */
679 /* > JOBVT = 'A', LDVT >= N; if JOBVT = 'S', LDVT >= f2cmin(M,N). */
682 /* > \param[out] WORK */
684 /* > WORK is COMPLEX array, dimension (MAX(1,LWORK)) */
685 /* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */
688 /* > \param[in] LWORK */
690 /* > LWORK is INTEGER */
691 /* > The dimension of the array WORK. */
692 /* > LWORK >= MAX(1,2*MIN(M,N)+MAX(M,N)). */
693 /* > For good performance, LWORK should generally be larger. */
695 /* > If LWORK = -1, then a workspace query is assumed; the routine */
696 /* > only calculates the optimal size of the WORK array, returns */
697 /* > this value as the first entry of the WORK array, and no error */
698 /* > message related to LWORK is issued by XERBLA. */
701 /* > \param[out] RWORK */
703 /* > RWORK is REAL array, dimension (5*f2cmin(M,N)) */
704 /* > On exit, if INFO > 0, RWORK(1:MIN(M,N)-1) contains the */
705 /* > unconverged superdiagonal elements of an upper bidiagonal */
706 /* > matrix B whose diagonal is in S (not necessarily sorted). */
707 /* > B satisfies A = U * B * VT, so it has the same singular */
708 /* > values as A, and singular vectors related by U and VT. */
711 /* > \param[out] INFO */
713 /* > INFO is INTEGER */
714 /* > = 0: successful exit. */
715 /* > < 0: if INFO = -i, the i-th argument had an illegal value. */
716 /* > > 0: if CBDSQR did not converge, INFO specifies how many */
717 /* > superdiagonals of an intermediate bidiagonal form B */
718 /* > did not converge to zero. See the description of RWORK */
719 /* > above for details. */
725 /* > \author Univ. of Tennessee */
726 /* > \author Univ. of California Berkeley */
727 /* > \author Univ. of Colorado Denver */
728 /* > \author NAG Ltd. */
730 /* > \date April 2012 */
732 /* > \ingroup complexGEsing */
734 /* ===================================================================== */
735 /* Subroutine */ int cgesvd_(char *jobu, char *jobvt, integer *m, integer *n,
736 complex *a, integer *lda, real *s, complex *u, integer *ldu, complex *
737 vt, integer *ldvt, complex *work, integer *lwork, real *rwork,
740 /* System generated locals */
742 integer a_dim1, a_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1[2],
746 /* Local variables */
750 integer ierr, itau, ncvt, nrvt, lwork_cgebrd__, lwork_cgelqf__,
752 extern /* Subroutine */ int cgemm_(char *, char *, integer *, integer *,
753 integer *, complex *, complex *, integer *, complex *, integer *,
754 complex *, complex *, integer *);
755 extern logical lsame_(char *, char *);
756 integer chunk, minmn, wrkbl, itaup, itauq, mnthr, iwork;
757 logical wntua, wntva, wntun, wntuo, wntvn, wntvo, wntus, wntvs;
759 extern /* Subroutine */ int cgebrd_(integer *, integer *, complex *,
760 integer *, real *, real *, complex *, complex *, complex *,
761 integer *, integer *);
762 extern real clange_(char *, integer *, integer *, complex *, integer *,
765 extern /* Subroutine */ int cgelqf_(integer *, integer *, complex *,
766 integer *, complex *, complex *, integer *, integer *), clascl_(
767 char *, integer *, integer *, real *, real *, integer *, integer *
768 , complex *, integer *, integer *), cgeqrf_(integer *,
769 integer *, complex *, integer *, complex *, complex *, integer *,
771 extern real slamch_(char *);
772 extern /* Subroutine */ int clacpy_(char *, integer *, integer *, complex
773 *, integer *, complex *, integer *), claset_(char *,
774 integer *, integer *, complex *, complex *, complex *, integer *), cbdsqr_(char *, integer *, integer *, integer *, integer
775 *, real *, real *, complex *, integer *, complex *, integer *,
776 complex *, integer *, real *, integer *), xerbla_(char *,
777 integer *, ftnlen), cungbr_(char *, integer *, integer *, integer
778 *, complex *, integer *, complex *, complex *, integer *, integer
781 extern /* Subroutine */ int slascl_(char *, integer *, integer *, real *,
782 real *, integer *, integer *, real *, integer *, integer *);
783 extern integer ilaenv_(integer *, char *, char *, integer *, integer *,
784 integer *, integer *, ftnlen, ftnlen);
785 extern /* Subroutine */ int cunmbr_(char *, char *, char *, integer *,
786 integer *, integer *, complex *, integer *, complex *, complex *,
787 integer *, complex *, integer *, integer *), cunglq_(integer *, integer *, integer *, complex *,
788 integer *, complex *, complex *, integer *, integer *), cungqr_(
789 integer *, integer *, integer *, complex *, integer *, complex *,
790 complex *, integer *, integer *);
791 integer ldwrkr, minwrk, ldwrku, maxwrk;
794 logical lquery, wntuas, wntvas;
795 integer lwork_cungbr_p__, lwork_cungbr_q__, lwork_cunglq_n__,
796 lwork_cunglq_m__, lwork_cungqr_m__, lwork_cungqr_n__, blk, ncu;
801 /* -- LAPACK driver routine (version 3.7.0) -- */
802 /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */
803 /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
807 /* ===================================================================== */
810 /* Test the input arguments */
812 /* Parameter adjustments */
814 a_offset = 1 + a_dim1 * 1;
818 u_offset = 1 + u_dim1 * 1;
821 vt_offset = 1 + vt_dim1 * 1;
828 minmn = f2cmin(*m,*n);
829 wntua = lsame_(jobu, "A");
830 wntus = lsame_(jobu, "S");
831 wntuas = wntua || wntus;
832 wntuo = lsame_(jobu, "O");
833 wntun = lsame_(jobu, "N");
834 wntva = lsame_(jobvt, "A");
835 wntvs = lsame_(jobvt, "S");
836 wntvas = wntva || wntvs;
837 wntvo = lsame_(jobvt, "O");
838 wntvn = lsame_(jobvt, "N");
839 lquery = *lwork == -1;
841 if (! (wntua || wntus || wntuo || wntun)) {
843 } else if (! (wntva || wntvs || wntvo || wntvn) || wntvo && wntuo) {
849 } else if (*lda < f2cmax(1,*m)) {
851 } else if (*ldu < 1 || wntuas && *ldu < *m) {
853 } else if (*ldvt < 1 || wntva && *ldvt < *n || wntvs && *ldvt < minmn) {
857 /* Compute workspace */
858 /* (Note: Comments in the code beginning "Workspace:" describe the */
859 /* minimal amount of workspace needed at that point in the code, */
860 /* as well as the preferred amount for good performance. */
861 /* CWorkspace refers to complex workspace, and RWorkspace to */
862 /* real workspace. NB refers to the optimal block size for the */
863 /* immediately following subroutine, as returned by ILAENV.) */
868 if (*m >= *n && minmn > 0) {
870 /* Space needed for ZBDSQR is BDSPAC = 5*N */
872 /* Writing concatenation */
873 i__1[0] = 1, a__1[0] = jobu;
874 i__1[1] = 1, a__1[1] = jobvt;
875 s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2);
876 mnthr = ilaenv_(&c__6, "CGESVD", ch__1, m, n, &c__0, &c__0, (
877 ftnlen)6, (ftnlen)2);
878 /* Compute space needed for CGEQRF */
879 cgeqrf_(m, n, &a[a_offset], lda, cdum, cdum, &c_n1, &ierr);
880 lwork_cgeqrf__ = (integer) cdum[0].r;
881 /* Compute space needed for CUNGQR */
882 cungqr_(m, n, n, &a[a_offset], lda, cdum, cdum, &c_n1, &ierr);
883 lwork_cungqr_n__ = (integer) cdum[0].r;
884 cungqr_(m, m, n, &a[a_offset], lda, cdum, cdum, &c_n1, &ierr);
885 lwork_cungqr_m__ = (integer) cdum[0].r;
886 /* Compute space needed for CGEBRD */
887 cgebrd_(n, n, &a[a_offset], lda, &s[1], dum, cdum, cdum, cdum, &
889 lwork_cgebrd__ = (integer) cdum[0].r;
890 /* Compute space needed for CUNGBR */
891 cungbr_("P", n, n, n, &a[a_offset], lda, cdum, cdum, &c_n1, &ierr);
892 lwork_cungbr_p__ = (integer) cdum[0].r;
893 cungbr_("Q", n, n, n, &a[a_offset], lda, cdum, cdum, &c_n1, &ierr);
894 lwork_cungbr_q__ = (integer) cdum[0].r;
896 /* Writing concatenation */
897 i__1[0] = 1, a__1[0] = jobu;
898 i__1[1] = 1, a__1[1] = jobvt;
899 s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2);
900 mnthr = ilaenv_(&c__6, "CGESVD", ch__1, m, n, &c__0, &c__0, (
901 ftnlen)6, (ftnlen)2);
905 /* Path 1 (M much larger than N, JOBU='N') */
907 maxwrk = *n + lwork_cgeqrf__;
909 i__2 = maxwrk, i__3 = (*n << 1) + lwork_cgebrd__;
910 maxwrk = f2cmax(i__2,i__3);
911 if (wntvo || wntvas) {
913 i__2 = maxwrk, i__3 = (*n << 1) + lwork_cungbr_p__;
914 maxwrk = f2cmax(i__2,i__3);
917 } else if (wntuo && wntvn) {
919 /* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */
921 wrkbl = *n + lwork_cgeqrf__;
923 i__2 = wrkbl, i__3 = *n + lwork_cungqr_n__;
924 wrkbl = f2cmax(i__2,i__3);
926 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cgebrd__;
927 wrkbl = f2cmax(i__2,i__3);
929 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_q__;
930 wrkbl = f2cmax(i__2,i__3);
932 i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n;
933 maxwrk = f2cmax(i__2,i__3);
934 minwrk = (*n << 1) + *m;
935 } else if (wntuo && wntvas) {
937 /* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or */
940 wrkbl = *n + lwork_cgeqrf__;
942 i__2 = wrkbl, i__3 = *n + lwork_cungqr_n__;
943 wrkbl = f2cmax(i__2,i__3);
945 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cgebrd__;
946 wrkbl = f2cmax(i__2,i__3);
948 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_q__;
949 wrkbl = f2cmax(i__2,i__3);
951 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_p__;
952 wrkbl = f2cmax(i__2,i__3);
954 i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n;
955 maxwrk = f2cmax(i__2,i__3);
956 minwrk = (*n << 1) + *m;
957 } else if (wntus && wntvn) {
959 /* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */
961 wrkbl = *n + lwork_cgeqrf__;
963 i__2 = wrkbl, i__3 = *n + lwork_cungqr_n__;
964 wrkbl = f2cmax(i__2,i__3);
966 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cgebrd__;
967 wrkbl = f2cmax(i__2,i__3);
969 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_q__;
970 wrkbl = f2cmax(i__2,i__3);
971 maxwrk = *n * *n + wrkbl;
972 minwrk = (*n << 1) + *m;
973 } else if (wntus && wntvo) {
975 /* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */
977 wrkbl = *n + lwork_cgeqrf__;
979 i__2 = wrkbl, i__3 = *n + lwork_cungqr_n__;
980 wrkbl = f2cmax(i__2,i__3);
982 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cgebrd__;
983 wrkbl = f2cmax(i__2,i__3);
985 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_q__;
986 wrkbl = f2cmax(i__2,i__3);
988 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_p__;
989 wrkbl = f2cmax(i__2,i__3);
990 maxwrk = (*n << 1) * *n + wrkbl;
991 minwrk = (*n << 1) + *m;
992 } else if (wntus && wntvas) {
994 /* Path 6 (M much larger than N, JOBU='S', JOBVT='S' or */
997 wrkbl = *n + lwork_cgeqrf__;
999 i__2 = wrkbl, i__3 = *n + lwork_cungqr_n__;
1000 wrkbl = f2cmax(i__2,i__3);
1002 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cgebrd__;
1003 wrkbl = f2cmax(i__2,i__3);
1005 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_q__;
1006 wrkbl = f2cmax(i__2,i__3);
1008 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_p__;
1009 wrkbl = f2cmax(i__2,i__3);
1010 maxwrk = *n * *n + wrkbl;
1011 minwrk = (*n << 1) + *m;
1012 } else if (wntua && wntvn) {
1014 /* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */
1016 wrkbl = *n + lwork_cgeqrf__;
1018 i__2 = wrkbl, i__3 = *n + lwork_cungqr_m__;
1019 wrkbl = f2cmax(i__2,i__3);
1021 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cgebrd__;
1022 wrkbl = f2cmax(i__2,i__3);
1024 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_q__;
1025 wrkbl = f2cmax(i__2,i__3);
1026 maxwrk = *n * *n + wrkbl;
1027 minwrk = (*n << 1) + *m;
1028 } else if (wntua && wntvo) {
1030 /* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */
1032 wrkbl = *n + lwork_cgeqrf__;
1034 i__2 = wrkbl, i__3 = *n + lwork_cungqr_m__;
1035 wrkbl = f2cmax(i__2,i__3);
1037 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cgebrd__;
1038 wrkbl = f2cmax(i__2,i__3);
1040 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_q__;
1041 wrkbl = f2cmax(i__2,i__3);
1043 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_p__;
1044 wrkbl = f2cmax(i__2,i__3);
1045 maxwrk = (*n << 1) * *n + wrkbl;
1046 minwrk = (*n << 1) + *m;
1047 } else if (wntua && wntvas) {
1049 /* Path 9 (M much larger than N, JOBU='A', JOBVT='S' or */
1052 wrkbl = *n + lwork_cgeqrf__;
1054 i__2 = wrkbl, i__3 = *n + lwork_cungqr_m__;
1055 wrkbl = f2cmax(i__2,i__3);
1057 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cgebrd__;
1058 wrkbl = f2cmax(i__2,i__3);
1060 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_q__;
1061 wrkbl = f2cmax(i__2,i__3);
1063 i__2 = wrkbl, i__3 = (*n << 1) + lwork_cungbr_p__;
1064 wrkbl = f2cmax(i__2,i__3);
1065 maxwrk = *n * *n + wrkbl;
1066 minwrk = (*n << 1) + *m;
1070 /* Path 10 (M at least N, but not much larger) */
1072 cgebrd_(m, n, &a[a_offset], lda, &s[1], dum, cdum, cdum, cdum,
1074 lwork_cgebrd__ = (integer) cdum[0].r;
1075 maxwrk = (*n << 1) + lwork_cgebrd__;
1076 if (wntus || wntuo) {
1077 cungbr_("Q", m, n, n, &a[a_offset], lda, cdum, cdum, &
1079 lwork_cungbr_q__ = (integer) cdum[0].r;
1081 i__2 = maxwrk, i__3 = (*n << 1) + lwork_cungbr_q__;
1082 maxwrk = f2cmax(i__2,i__3);
1085 cungbr_("Q", m, m, n, &a[a_offset], lda, cdum, cdum, &
1087 lwork_cungbr_q__ = (integer) cdum[0].r;
1089 i__2 = maxwrk, i__3 = (*n << 1) + lwork_cungbr_q__;
1090 maxwrk = f2cmax(i__2,i__3);
1094 i__2 = maxwrk, i__3 = (*n << 1) + lwork_cungbr_p__;
1095 maxwrk = f2cmax(i__2,i__3);
1097 minwrk = (*n << 1) + *m;
1099 } else if (minmn > 0) {
1101 /* Space needed for CBDSQR is BDSPAC = 5*M */
1103 /* Writing concatenation */
1104 i__1[0] = 1, a__1[0] = jobu;
1105 i__1[1] = 1, a__1[1] = jobvt;
1106 s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2);
1107 mnthr = ilaenv_(&c__6, "CGESVD", ch__1, m, n, &c__0, &c__0, (
1108 ftnlen)6, (ftnlen)2);
1109 /* Compute space needed for CGELQF */
1110 cgelqf_(m, n, &a[a_offset], lda, cdum, cdum, &c_n1, &ierr);
1111 lwork_cgelqf__ = (integer) cdum[0].r;
1112 /* Compute space needed for CUNGLQ */
1113 cunglq_(n, n, m, cdum, n, cdum, cdum, &c_n1, &ierr);
1114 lwork_cunglq_n__ = (integer) cdum[0].r;
1115 cunglq_(m, n, m, &a[a_offset], lda, cdum, cdum, &c_n1, &ierr);
1116 lwork_cunglq_m__ = (integer) cdum[0].r;
1117 /* Compute space needed for CGEBRD */
1118 cgebrd_(m, m, &a[a_offset], lda, &s[1], dum, cdum, cdum, cdum, &
1120 lwork_cgebrd__ = (integer) cdum[0].r;
1121 /* Compute space needed for CUNGBR P */
1122 cungbr_("P", m, m, m, &a[a_offset], n, cdum, cdum, &c_n1, &ierr);
1123 lwork_cungbr_p__ = (integer) cdum[0].r;
1124 /* Compute space needed for CUNGBR Q */
1125 cungbr_("Q", m, m, m, &a[a_offset], n, cdum, cdum, &c_n1, &ierr);
1126 lwork_cungbr_q__ = (integer) cdum[0].r;
1130 /* Path 1t(N much larger than M, JOBVT='N') */
1132 maxwrk = *m + lwork_cgelqf__;
1134 i__2 = maxwrk, i__3 = (*m << 1) + lwork_cgebrd__;
1135 maxwrk = f2cmax(i__2,i__3);
1136 if (wntuo || wntuas) {
1138 i__2 = maxwrk, i__3 = (*m << 1) + lwork_cungbr_q__;
1139 maxwrk = f2cmax(i__2,i__3);
1142 } else if (wntvo && wntun) {
1144 /* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */
1146 wrkbl = *m + lwork_cgelqf__;
1148 i__2 = wrkbl, i__3 = *m + lwork_cunglq_m__;
1149 wrkbl = f2cmax(i__2,i__3);
1151 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cgebrd__;
1152 wrkbl = f2cmax(i__2,i__3);
1154 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_p__;
1155 wrkbl = f2cmax(i__2,i__3);
1157 i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n;
1158 maxwrk = f2cmax(i__2,i__3);
1159 minwrk = (*m << 1) + *n;
1160 } else if (wntvo && wntuas) {
1162 /* Path 3t(N much larger than M, JOBU='S' or 'A', */
1165 wrkbl = *m + lwork_cgelqf__;
1167 i__2 = wrkbl, i__3 = *m + lwork_cunglq_m__;
1168 wrkbl = f2cmax(i__2,i__3);
1170 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cgebrd__;
1171 wrkbl = f2cmax(i__2,i__3);
1173 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_p__;
1174 wrkbl = f2cmax(i__2,i__3);
1176 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_q__;
1177 wrkbl = f2cmax(i__2,i__3);
1179 i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n;
1180 maxwrk = f2cmax(i__2,i__3);
1181 minwrk = (*m << 1) + *n;
1182 } else if (wntvs && wntun) {
1184 /* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */
1186 wrkbl = *m + lwork_cgelqf__;
1188 i__2 = wrkbl, i__3 = *m + lwork_cunglq_m__;
1189 wrkbl = f2cmax(i__2,i__3);
1191 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cgebrd__;
1192 wrkbl = f2cmax(i__2,i__3);
1194 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_p__;
1195 wrkbl = f2cmax(i__2,i__3);
1196 maxwrk = *m * *m + wrkbl;
1197 minwrk = (*m << 1) + *n;
1198 } else if (wntvs && wntuo) {
1200 /* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */
1202 wrkbl = *m + lwork_cgelqf__;
1204 i__2 = wrkbl, i__3 = *m + lwork_cunglq_m__;
1205 wrkbl = f2cmax(i__2,i__3);
1207 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cgebrd__;
1208 wrkbl = f2cmax(i__2,i__3);
1210 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_p__;
1211 wrkbl = f2cmax(i__2,i__3);
1213 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_q__;
1214 wrkbl = f2cmax(i__2,i__3);
1215 maxwrk = (*m << 1) * *m + wrkbl;
1216 minwrk = (*m << 1) + *n;
1217 } else if (wntvs && wntuas) {
1219 /* Path 6t(N much larger than M, JOBU='S' or 'A', */
1222 wrkbl = *m + lwork_cgelqf__;
1224 i__2 = wrkbl, i__3 = *m + lwork_cunglq_m__;
1225 wrkbl = f2cmax(i__2,i__3);
1227 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cgebrd__;
1228 wrkbl = f2cmax(i__2,i__3);
1230 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_p__;
1231 wrkbl = f2cmax(i__2,i__3);
1233 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_q__;
1234 wrkbl = f2cmax(i__2,i__3);
1235 maxwrk = *m * *m + wrkbl;
1236 minwrk = (*m << 1) + *n;
1237 } else if (wntva && wntun) {
1239 /* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */
1241 wrkbl = *m + lwork_cgelqf__;
1243 i__2 = wrkbl, i__3 = *m + lwork_cunglq_n__;
1244 wrkbl = f2cmax(i__2,i__3);
1246 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cgebrd__;
1247 wrkbl = f2cmax(i__2,i__3);
1249 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_p__;
1250 wrkbl = f2cmax(i__2,i__3);
1251 maxwrk = *m * *m + wrkbl;
1252 minwrk = (*m << 1) + *n;
1253 } else if (wntva && wntuo) {
1255 /* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */
1257 wrkbl = *m + lwork_cgelqf__;
1259 i__2 = wrkbl, i__3 = *m + lwork_cunglq_n__;
1260 wrkbl = f2cmax(i__2,i__3);
1262 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cgebrd__;
1263 wrkbl = f2cmax(i__2,i__3);
1265 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_p__;
1266 wrkbl = f2cmax(i__2,i__3);
1268 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_q__;
1269 wrkbl = f2cmax(i__2,i__3);
1270 maxwrk = (*m << 1) * *m + wrkbl;
1271 minwrk = (*m << 1) + *n;
1272 } else if (wntva && wntuas) {
1274 /* Path 9t(N much larger than M, JOBU='S' or 'A', */
1277 wrkbl = *m + lwork_cgelqf__;
1279 i__2 = wrkbl, i__3 = *m + lwork_cunglq_n__;
1280 wrkbl = f2cmax(i__2,i__3);
1282 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cgebrd__;
1283 wrkbl = f2cmax(i__2,i__3);
1285 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_p__;
1286 wrkbl = f2cmax(i__2,i__3);
1288 i__2 = wrkbl, i__3 = (*m << 1) + lwork_cungbr_q__;
1289 wrkbl = f2cmax(i__2,i__3);
1290 maxwrk = *m * *m + wrkbl;
1291 minwrk = (*m << 1) + *n;
1295 /* Path 10t(N greater than M, but not much larger) */
1297 cgebrd_(m, n, &a[a_offset], lda, &s[1], dum, cdum, cdum, cdum,
1299 lwork_cgebrd__ = (integer) cdum[0].r;
1300 maxwrk = (*m << 1) + lwork_cgebrd__;
1301 if (wntvs || wntvo) {
1302 /* Compute space needed for CUNGBR P */
1303 cungbr_("P", m, n, m, &a[a_offset], n, cdum, cdum, &c_n1,
1305 lwork_cungbr_p__ = (integer) cdum[0].r;
1307 i__2 = maxwrk, i__3 = (*m << 1) + lwork_cungbr_p__;
1308 maxwrk = f2cmax(i__2,i__3);
1311 cungbr_("P", n, n, m, &a[a_offset], n, cdum, cdum, &c_n1,
1313 lwork_cungbr_p__ = (integer) cdum[0].r;
1315 i__2 = maxwrk, i__3 = (*m << 1) + lwork_cungbr_p__;
1316 maxwrk = f2cmax(i__2,i__3);
1320 i__2 = maxwrk, i__3 = (*m << 1) + lwork_cungbr_q__;
1321 maxwrk = f2cmax(i__2,i__3);
1323 minwrk = (*m << 1) + *n;
1326 maxwrk = f2cmax(minwrk,maxwrk);
1327 work[1].r = (real) maxwrk, work[1].i = 0.f;
1329 if (*lwork < minwrk && ! lquery) {
1336 xerbla_("CGESVD", &i__2, (ftnlen)6);
1338 } else if (lquery) {
1342 /* Quick return if possible */
1344 if (*m == 0 || *n == 0) {
1348 /* Get machine constants */
1351 smlnum = sqrt(slamch_("S")) / eps;
1352 bignum = 1.f / smlnum;
1354 /* Scale A if f2cmax element outside range [SMLNUM,BIGNUM] */
1356 anrm = clange_("M", m, n, &a[a_offset], lda, dum);
1358 if (anrm > 0.f && anrm < smlnum) {
1360 clascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, &
1362 } else if (anrm > bignum) {
1364 clascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, &
1370 /* A has at least as many rows as columns. If A has sufficiently */
1371 /* more rows than columns, first reduce using the QR */
1372 /* decomposition (if sufficient workspace available) */
1378 /* Path 1 (M much larger than N, JOBU='N') */
1379 /* No left singular vectors to be computed */
1385 /* (CWorkspace: need 2*N, prefer N+N*NB) */
1386 /* (RWorkspace: need 0) */
1388 i__2 = *lwork - iwork + 1;
1389 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &
1392 /* Zero out below R */
1397 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &a[a_dim1 + 2],
1405 /* Bidiagonalize R in A */
1406 /* (CWorkspace: need 3*N, prefer 2*N+2*N*NB) */
1407 /* (RWorkspace: need N) */
1409 i__2 = *lwork - iwork + 1;
1410 cgebrd_(n, n, &a[a_offset], lda, &s[1], &rwork[ie], &work[
1411 itauq], &work[itaup], &work[iwork], &i__2, &ierr);
1413 if (wntvo || wntvas) {
1415 /* If right singular vectors desired, generate P'. */
1416 /* (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB) */
1417 /* (RWorkspace: 0) */
1419 i__2 = *lwork - iwork + 1;
1420 cungbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], &
1421 work[iwork], &i__2, &ierr);
1426 /* Perform bidiagonal QR iteration, computing right */
1427 /* singular vectors of A in A if desired */
1428 /* (CWorkspace: 0) */
1429 /* (RWorkspace: need BDSPAC) */
1431 cbdsqr_("U", n, &ncvt, &c__0, &c__0, &s[1], &rwork[ie], &a[
1432 a_offset], lda, cdum, &c__1, cdum, &c__1, &rwork[
1435 /* If right singular vectors desired in VT, copy them there */
1438 clacpy_("F", n, n, &a[a_offset], lda, &vt[vt_offset],
1442 } else if (wntuo && wntvn) {
1444 /* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */
1445 /* N left singular vectors to be overwritten on A and */
1446 /* no right singular vectors to be computed */
1448 if (*lwork >= *n * *n + *n * 3) {
1450 /* Sufficient workspace for a fast algorithm */
1454 i__2 = wrkbl, i__3 = *lda * *n;
1455 if (*lwork >= f2cmax(i__2,i__3) + *lda * *n) {
1457 /* WORK(IU) is LDA by N, WORK(IR) is LDA by N */
1461 } else /* if(complicated condition) */ {
1463 i__2 = wrkbl, i__3 = *lda * *n;
1464 if (*lwork >= f2cmax(i__2,i__3) + *n * *n) {
1466 /* WORK(IU) is LDA by N, WORK(IR) is N by N */
1472 /* WORK(IU) is LDWRKU by N, WORK(IR) is N by N */
1474 ldwrku = (*lwork - *n * *n) / *n;
1478 itau = ir + ldwrkr * *n;
1482 /* (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB) */
1483 /* (RWorkspace: 0) */
1485 i__2 = *lwork - iwork + 1;
1486 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork]
1489 /* Copy R to WORK(IR) and zero out below it */
1491 clacpy_("U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr);
1494 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &work[ir + 1], &
1497 /* Generate Q in A */
1498 /* (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB) */
1499 /* (RWorkspace: 0) */
1501 i__2 = *lwork - iwork + 1;
1502 cungqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[
1503 iwork], &i__2, &ierr);
1509 /* Bidiagonalize R in WORK(IR) */
1510 /* (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB) */
1511 /* (RWorkspace: need N) */
1513 i__2 = *lwork - iwork + 1;
1514 cgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &rwork[ie], &
1515 work[itauq], &work[itaup], &work[iwork], &i__2, &
1518 /* Generate left vectors bidiagonalizing R */
1519 /* (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB) */
1520 /* (RWorkspace: need 0) */
1522 i__2 = *lwork - iwork + 1;
1523 cungbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], &
1524 work[iwork], &i__2, &ierr);
1527 /* Perform bidiagonal QR iteration, computing left */
1528 /* singular vectors of R in WORK(IR) */
1529 /* (CWorkspace: need N*N) */
1530 /* (RWorkspace: need BDSPAC) */
1532 cbdsqr_("U", n, &c__0, n, &c__0, &s[1], &rwork[ie], cdum,
1533 &c__1, &work[ir], &ldwrkr, cdum, &c__1, &rwork[
1537 /* Multiply Q in A by left singular vectors of R in */
1538 /* WORK(IR), storing result in WORK(IU) and copying to A */
1539 /* (CWorkspace: need N*N+N, prefer N*N+M*N) */
1540 /* (RWorkspace: 0) */
1544 for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ +=
1547 i__4 = *m - i__ + 1;
1548 chunk = f2cmin(i__4,ldwrku);
1549 cgemm_("N", "N", &chunk, n, n, &c_b2, &a[i__ + a_dim1]
1550 , lda, &work[ir], &ldwrkr, &c_b1, &work[iu], &
1552 clacpy_("F", &chunk, n, &work[iu], &ldwrku, &a[i__ +
1559 /* Insufficient workspace for a fast algorithm */
1566 /* Bidiagonalize A */
1567 /* (CWorkspace: need 2*N+M, prefer 2*N+(M+N)*NB) */
1568 /* (RWorkspace: N) */
1570 i__3 = *lwork - iwork + 1;
1571 cgebrd_(m, n, &a[a_offset], lda, &s[1], &rwork[ie], &work[
1572 itauq], &work[itaup], &work[iwork], &i__3, &ierr);
1574 /* Generate left vectors bidiagonalizing A */
1575 /* (CWorkspace: need 3*N, prefer 2*N+N*NB) */
1576 /* (RWorkspace: 0) */
1578 i__3 = *lwork - iwork + 1;
1579 cungbr_("Q", m, n, n, &a[a_offset], lda, &work[itauq], &
1580 work[iwork], &i__3, &ierr);
1583 /* Perform bidiagonal QR iteration, computing left */
1584 /* singular vectors of A in A */
1585 /* (CWorkspace: need 0) */
1586 /* (RWorkspace: need BDSPAC) */
1588 cbdsqr_("U", n, &c__0, m, &c__0, &s[1], &rwork[ie], cdum,
1589 &c__1, &a[a_offset], lda, cdum, &c__1, &rwork[
1594 } else if (wntuo && wntvas) {
1596 /* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A') */
1597 /* N left singular vectors to be overwritten on A and */
1598 /* N right singular vectors to be computed in VT */
1600 if (*lwork >= *n * *n + *n * 3) {
1602 /* Sufficient workspace for a fast algorithm */
1606 i__3 = wrkbl, i__2 = *lda * *n;
1607 if (*lwork >= f2cmax(i__3,i__2) + *lda * *n) {
1609 /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */
1613 } else /* if(complicated condition) */ {
1615 i__3 = wrkbl, i__2 = *lda * *n;
1616 if (*lwork >= f2cmax(i__3,i__2) + *n * *n) {
1618 /* WORK(IU) is LDA by N and WORK(IR) is N by N */
1624 /* WORK(IU) is LDWRKU by N and WORK(IR) is N by N */
1626 ldwrku = (*lwork - *n * *n) / *n;
1630 itau = ir + ldwrkr * *n;
1634 /* (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB) */
1635 /* (RWorkspace: 0) */
1637 i__3 = *lwork - iwork + 1;
1638 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork]
1641 /* Copy R to VT, zeroing out below it */
1643 clacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset],
1648 claset_("L", &i__3, &i__2, &c_b1, &c_b1, &vt[vt_dim1
1652 /* Generate Q in A */
1653 /* (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB) */
1654 /* (RWorkspace: 0) */
1656 i__3 = *lwork - iwork + 1;
1657 cungqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[
1658 iwork], &i__3, &ierr);
1664 /* Bidiagonalize R in VT, copying result to WORK(IR) */
1665 /* (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB) */
1666 /* (RWorkspace: need N) */
1668 i__3 = *lwork - iwork + 1;
1669 cgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &rwork[ie], &
1670 work[itauq], &work[itaup], &work[iwork], &i__3, &
1672 clacpy_("L", n, n, &vt[vt_offset], ldvt, &work[ir], &
1675 /* Generate left vectors bidiagonalizing R in WORK(IR) */
1676 /* (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB) */
1677 /* (RWorkspace: 0) */
1679 i__3 = *lwork - iwork + 1;
1680 cungbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], &
1681 work[iwork], &i__3, &ierr);
1683 /* Generate right vectors bidiagonalizing R in VT */
1684 /* (CWorkspace: need N*N+3*N-1, prefer N*N+2*N+(N-1)*NB) */
1685 /* (RWorkspace: 0) */
1687 i__3 = *lwork - iwork + 1;
1688 cungbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup],
1689 &work[iwork], &i__3, &ierr);
1692 /* Perform bidiagonal QR iteration, computing left */
1693 /* singular vectors of R in WORK(IR) and computing right */
1694 /* singular vectors of R in VT */
1695 /* (CWorkspace: need N*N) */
1696 /* (RWorkspace: need BDSPAC) */
1698 cbdsqr_("U", n, n, n, &c__0, &s[1], &rwork[ie], &vt[
1699 vt_offset], ldvt, &work[ir], &ldwrkr, cdum, &c__1,
1700 &rwork[irwork], info);
1703 /* Multiply Q in A by left singular vectors of R in */
1704 /* WORK(IR), storing result in WORK(IU) and copying to A */
1705 /* (CWorkspace: need N*N+N, prefer N*N+M*N) */
1706 /* (RWorkspace: 0) */
1710 for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ +=
1713 i__4 = *m - i__ + 1;
1714 chunk = f2cmin(i__4,ldwrku);
1715 cgemm_("N", "N", &chunk, n, n, &c_b2, &a[i__ + a_dim1]
1716 , lda, &work[ir], &ldwrkr, &c_b1, &work[iu], &
1718 clacpy_("F", &chunk, n, &work[iu], &ldwrku, &a[i__ +
1725 /* Insufficient workspace for a fast algorithm */
1731 /* (CWorkspace: need 2*N, prefer N+N*NB) */
1732 /* (RWorkspace: 0) */
1734 i__2 = *lwork - iwork + 1;
1735 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork]
1738 /* Copy R to VT, zeroing out below it */
1740 clacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset],
1745 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &vt[vt_dim1
1749 /* Generate Q in A */
1750 /* (CWorkspace: need 2*N, prefer N+N*NB) */
1751 /* (RWorkspace: 0) */
1753 i__2 = *lwork - iwork + 1;
1754 cungqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[
1755 iwork], &i__2, &ierr);
1761 /* Bidiagonalize R in VT */
1762 /* (CWorkspace: need 3*N, prefer 2*N+2*N*NB) */
1763 /* (RWorkspace: N) */
1765 i__2 = *lwork - iwork + 1;
1766 cgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &rwork[ie], &
1767 work[itauq], &work[itaup], &work[iwork], &i__2, &
1770 /* Multiply Q in A by left vectors bidiagonalizing R */
1771 /* (CWorkspace: need 2*N+M, prefer 2*N+M*NB) */
1772 /* (RWorkspace: 0) */
1774 i__2 = *lwork - iwork + 1;
1775 cunmbr_("Q", "R", "N", m, n, n, &vt[vt_offset], ldvt, &
1776 work[itauq], &a[a_offset], lda, &work[iwork], &
1779 /* Generate right vectors bidiagonalizing R in VT */
1780 /* (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB) */
1781 /* (RWorkspace: 0) */
1783 i__2 = *lwork - iwork + 1;
1784 cungbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup],
1785 &work[iwork], &i__2, &ierr);
1788 /* Perform bidiagonal QR iteration, computing left */
1789 /* singular vectors of A in A and computing right */
1790 /* singular vectors of A in VT */
1791 /* (CWorkspace: 0) */
1792 /* (RWorkspace: need BDSPAC) */
1794 cbdsqr_("U", n, n, m, &c__0, &s[1], &rwork[ie], &vt[
1795 vt_offset], ldvt, &a[a_offset], lda, cdum, &c__1,
1796 &rwork[irwork], info);
1804 /* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */
1805 /* N left singular vectors to be computed in U and */
1806 /* no right singular vectors to be computed */
1808 if (*lwork >= *n * *n + *n * 3) {
1810 /* Sufficient workspace for a fast algorithm */
1813 if (*lwork >= wrkbl + *lda * *n) {
1815 /* WORK(IR) is LDA by N */
1820 /* WORK(IR) is N by N */
1824 itau = ir + ldwrkr * *n;
1828 /* (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB) */
1829 /* (RWorkspace: 0) */
1831 i__2 = *lwork - iwork + 1;
1832 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
1833 iwork], &i__2, &ierr);
1835 /* Copy R to WORK(IR), zeroing out below it */
1837 clacpy_("U", n, n, &a[a_offset], lda, &work[ir], &
1841 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &work[ir + 1]
1844 /* Generate Q in A */
1845 /* (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB) */
1846 /* (RWorkspace: 0) */
1848 i__2 = *lwork - iwork + 1;
1849 cungqr_(m, n, n, &a[a_offset], lda, &work[itau], &
1850 work[iwork], &i__2, &ierr);
1856 /* Bidiagonalize R in WORK(IR) */
1857 /* (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB) */
1858 /* (RWorkspace: need N) */
1860 i__2 = *lwork - iwork + 1;
1861 cgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &rwork[ie], &
1862 work[itauq], &work[itaup], &work[iwork], &
1865 /* Generate left vectors bidiagonalizing R in WORK(IR) */
1866 /* (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB) */
1867 /* (RWorkspace: 0) */
1869 i__2 = *lwork - iwork + 1;
1870 cungbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq]
1871 , &work[iwork], &i__2, &ierr);
1874 /* Perform bidiagonal QR iteration, computing left */
1875 /* singular vectors of R in WORK(IR) */
1876 /* (CWorkspace: need N*N) */
1877 /* (RWorkspace: need BDSPAC) */
1879 cbdsqr_("U", n, &c__0, n, &c__0, &s[1], &rwork[ie],
1880 cdum, &c__1, &work[ir], &ldwrkr, cdum, &c__1,
1881 &rwork[irwork], info);
1883 /* Multiply Q in A by left singular vectors of R in */
1884 /* WORK(IR), storing result in U */
1885 /* (CWorkspace: need N*N) */
1886 /* (RWorkspace: 0) */
1888 cgemm_("N", "N", m, n, n, &c_b2, &a[a_offset], lda, &
1889 work[ir], &ldwrkr, &c_b1, &u[u_offset], ldu);
1893 /* Insufficient workspace for a fast algorithm */
1898 /* Compute A=Q*R, copying result to U */
1899 /* (CWorkspace: need 2*N, prefer N+N*NB) */
1900 /* (RWorkspace: 0) */
1902 i__2 = *lwork - iwork + 1;
1903 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
1904 iwork], &i__2, &ierr);
1905 clacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
1908 /* Generate Q in U */
1909 /* (CWorkspace: need 2*N, prefer N+N*NB) */
1910 /* (RWorkspace: 0) */
1912 i__2 = *lwork - iwork + 1;
1913 cungqr_(m, n, n, &u[u_offset], ldu, &work[itau], &
1914 work[iwork], &i__2, &ierr);
1920 /* Zero out below R in A */
1925 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &a[
1929 /* Bidiagonalize R in A */
1930 /* (CWorkspace: need 3*N, prefer 2*N+2*N*NB) */
1931 /* (RWorkspace: need N) */
1933 i__2 = *lwork - iwork + 1;
1934 cgebrd_(n, n, &a[a_offset], lda, &s[1], &rwork[ie], &
1935 work[itauq], &work[itaup], &work[iwork], &
1938 /* Multiply Q in U by left vectors bidiagonalizing R */
1939 /* (CWorkspace: need 2*N+M, prefer 2*N+M*NB) */
1940 /* (RWorkspace: 0) */
1942 i__2 = *lwork - iwork + 1;
1943 cunmbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, &
1944 work[itauq], &u[u_offset], ldu, &work[iwork],
1949 /* Perform bidiagonal QR iteration, computing left */
1950 /* singular vectors of A in U */
1951 /* (CWorkspace: 0) */
1952 /* (RWorkspace: need BDSPAC) */
1954 cbdsqr_("U", n, &c__0, m, &c__0, &s[1], &rwork[ie],
1955 cdum, &c__1, &u[u_offset], ldu, cdum, &c__1, &
1956 rwork[irwork], info);
1962 /* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */
1963 /* N left singular vectors to be computed in U and */
1964 /* N right singular vectors to be overwritten on A */
1966 if (*lwork >= (*n << 1) * *n + *n * 3) {
1968 /* Sufficient workspace for a fast algorithm */
1971 if (*lwork >= wrkbl + (*lda << 1) * *n) {
1973 /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */
1976 ir = iu + ldwrku * *n;
1978 } else if (*lwork >= wrkbl + (*lda + *n) * *n) {
1980 /* WORK(IU) is LDA by N and WORK(IR) is N by N */
1983 ir = iu + ldwrku * *n;
1987 /* WORK(IU) is N by N and WORK(IR) is N by N */
1990 ir = iu + ldwrku * *n;
1993 itau = ir + ldwrkr * *n;
1997 /* (CWorkspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB) */
1998 /* (RWorkspace: 0) */
2000 i__2 = *lwork - iwork + 1;
2001 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2002 iwork], &i__2, &ierr);
2004 /* Copy R to WORK(IU), zeroing out below it */
2006 clacpy_("U", n, n, &a[a_offset], lda, &work[iu], &
2010 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &work[iu + 1]
2013 /* Generate Q in A */
2014 /* (CWorkspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB) */
2015 /* (RWorkspace: 0) */
2017 i__2 = *lwork - iwork + 1;
2018 cungqr_(m, n, n, &a[a_offset], lda, &work[itau], &
2019 work[iwork], &i__2, &ierr);
2025 /* Bidiagonalize R in WORK(IU), copying result to */
2027 /* (CWorkspace: need 2*N*N+3*N, */
2028 /* prefer 2*N*N+2*N+2*N*NB) */
2029 /* (RWorkspace: need N) */
2031 i__2 = *lwork - iwork + 1;
2032 cgebrd_(n, n, &work[iu], &ldwrku, &s[1], &rwork[ie], &
2033 work[itauq], &work[itaup], &work[iwork], &
2035 clacpy_("U", n, n, &work[iu], &ldwrku, &work[ir], &
2038 /* Generate left bidiagonalizing vectors in WORK(IU) */
2039 /* (CWorkspace: need 2*N*N+3*N, prefer 2*N*N+2*N+N*NB) */
2040 /* (RWorkspace: 0) */
2042 i__2 = *lwork - iwork + 1;
2043 cungbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq]
2044 , &work[iwork], &i__2, &ierr);
2046 /* Generate right bidiagonalizing vectors in WORK(IR) */
2047 /* (CWorkspace: need 2*N*N+3*N-1, */
2048 /* prefer 2*N*N+2*N+(N-1)*NB) */
2049 /* (RWorkspace: 0) */
2051 i__2 = *lwork - iwork + 1;
2052 cungbr_("P", n, n, n, &work[ir], &ldwrkr, &work[itaup]
2053 , &work[iwork], &i__2, &ierr);
2056 /* Perform bidiagonal QR iteration, computing left */
2057 /* singular vectors of R in WORK(IU) and computing */
2058 /* right singular vectors of R in WORK(IR) */
2059 /* (CWorkspace: need 2*N*N) */
2060 /* (RWorkspace: need BDSPAC) */
2062 cbdsqr_("U", n, n, n, &c__0, &s[1], &rwork[ie], &work[
2063 ir], &ldwrkr, &work[iu], &ldwrku, cdum, &c__1,
2064 &rwork[irwork], info);
2066 /* Multiply Q in A by left singular vectors of R in */
2067 /* WORK(IU), storing result in U */
2068 /* (CWorkspace: need N*N) */
2069 /* (RWorkspace: 0) */
2071 cgemm_("N", "N", m, n, n, &c_b2, &a[a_offset], lda, &
2072 work[iu], &ldwrku, &c_b1, &u[u_offset], ldu);
2074 /* Copy right singular vectors of R to A */
2075 /* (CWorkspace: need N*N) */
2076 /* (RWorkspace: 0) */
2078 clacpy_("F", n, n, &work[ir], &ldwrkr, &a[a_offset],
2083 /* Insufficient workspace for a fast algorithm */
2088 /* Compute A=Q*R, copying result to U */
2089 /* (CWorkspace: need 2*N, prefer N+N*NB) */
2090 /* (RWorkspace: 0) */
2092 i__2 = *lwork - iwork + 1;
2093 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2094 iwork], &i__2, &ierr);
2095 clacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2098 /* Generate Q in U */
2099 /* (CWorkspace: need 2*N, prefer N+N*NB) */
2100 /* (RWorkspace: 0) */
2102 i__2 = *lwork - iwork + 1;
2103 cungqr_(m, n, n, &u[u_offset], ldu, &work[itau], &
2104 work[iwork], &i__2, &ierr);
2110 /* Zero out below R in A */
2115 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &a[
2119 /* Bidiagonalize R in A */
2120 /* (CWorkspace: need 3*N, prefer 2*N+2*N*NB) */
2121 /* (RWorkspace: need N) */
2123 i__2 = *lwork - iwork + 1;
2124 cgebrd_(n, n, &a[a_offset], lda, &s[1], &rwork[ie], &
2125 work[itauq], &work[itaup], &work[iwork], &
2128 /* Multiply Q in U by left vectors bidiagonalizing R */
2129 /* (CWorkspace: need 2*N+M, prefer 2*N+M*NB) */
2130 /* (RWorkspace: 0) */
2132 i__2 = *lwork - iwork + 1;
2133 cunmbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, &
2134 work[itauq], &u[u_offset], ldu, &work[iwork],
2138 /* Generate right vectors bidiagonalizing R in A */
2139 /* (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB) */
2140 /* (RWorkspace: 0) */
2142 i__2 = *lwork - iwork + 1;
2143 cungbr_("P", n, n, n, &a[a_offset], lda, &work[itaup],
2144 &work[iwork], &i__2, &ierr);
2147 /* Perform bidiagonal QR iteration, computing left */
2148 /* singular vectors of A in U and computing right */
2149 /* singular vectors of A in A */
2150 /* (CWorkspace: 0) */
2151 /* (RWorkspace: need BDSPAC) */
2153 cbdsqr_("U", n, n, m, &c__0, &s[1], &rwork[ie], &a[
2154 a_offset], lda, &u[u_offset], ldu, cdum, &
2155 c__1, &rwork[irwork], info);
2159 } else if (wntvas) {
2161 /* Path 6 (M much larger than N, JOBU='S', JOBVT='S' */
2163 /* N left singular vectors to be computed in U and */
2164 /* N right singular vectors to be computed in VT */
2166 if (*lwork >= *n * *n + *n * 3) {
2168 /* Sufficient workspace for a fast algorithm */
2171 if (*lwork >= wrkbl + *lda * *n) {
2173 /* WORK(IU) is LDA by N */
2178 /* WORK(IU) is N by N */
2182 itau = iu + ldwrku * *n;
2186 /* (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB) */
2187 /* (RWorkspace: 0) */
2189 i__2 = *lwork - iwork + 1;
2190 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2191 iwork], &i__2, &ierr);
2193 /* Copy R to WORK(IU), zeroing out below it */
2195 clacpy_("U", n, n, &a[a_offset], lda, &work[iu], &
2199 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &work[iu + 1]
2202 /* Generate Q in A */
2203 /* (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB) */
2204 /* (RWorkspace: 0) */
2206 i__2 = *lwork - iwork + 1;
2207 cungqr_(m, n, n, &a[a_offset], lda, &work[itau], &
2208 work[iwork], &i__2, &ierr);
2214 /* Bidiagonalize R in WORK(IU), copying result to VT */
2215 /* (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB) */
2216 /* (RWorkspace: need N) */
2218 i__2 = *lwork - iwork + 1;
2219 cgebrd_(n, n, &work[iu], &ldwrku, &s[1], &rwork[ie], &
2220 work[itauq], &work[itaup], &work[iwork], &
2222 clacpy_("U", n, n, &work[iu], &ldwrku, &vt[vt_offset],
2225 /* Generate left bidiagonalizing vectors in WORK(IU) */
2226 /* (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB) */
2227 /* (RWorkspace: 0) */
2229 i__2 = *lwork - iwork + 1;
2230 cungbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq]
2231 , &work[iwork], &i__2, &ierr);
2233 /* Generate right bidiagonalizing vectors in VT */
2234 /* (CWorkspace: need N*N+3*N-1, */
2235 /* prefer N*N+2*N+(N-1)*NB) */
2236 /* (RWorkspace: 0) */
2238 i__2 = *lwork - iwork + 1;
2239 cungbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[
2240 itaup], &work[iwork], &i__2, &ierr)
2244 /* Perform bidiagonal QR iteration, computing left */
2245 /* singular vectors of R in WORK(IU) and computing */
2246 /* right singular vectors of R in VT */
2247 /* (CWorkspace: need N*N) */
2248 /* (RWorkspace: need BDSPAC) */
2250 cbdsqr_("U", n, n, n, &c__0, &s[1], &rwork[ie], &vt[
2251 vt_offset], ldvt, &work[iu], &ldwrku, cdum, &
2252 c__1, &rwork[irwork], info);
2254 /* Multiply Q in A by left singular vectors of R in */
2255 /* WORK(IU), storing result in U */
2256 /* (CWorkspace: need N*N) */
2257 /* (RWorkspace: 0) */
2259 cgemm_("N", "N", m, n, n, &c_b2, &a[a_offset], lda, &
2260 work[iu], &ldwrku, &c_b1, &u[u_offset], ldu);
2264 /* Insufficient workspace for a fast algorithm */
2269 /* Compute A=Q*R, copying result to U */
2270 /* (CWorkspace: need 2*N, prefer N+N*NB) */
2271 /* (RWorkspace: 0) */
2273 i__2 = *lwork - iwork + 1;
2274 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2275 iwork], &i__2, &ierr);
2276 clacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2279 /* Generate Q in U */
2280 /* (CWorkspace: need 2*N, prefer N+N*NB) */
2281 /* (RWorkspace: 0) */
2283 i__2 = *lwork - iwork + 1;
2284 cungqr_(m, n, n, &u[u_offset], ldu, &work[itau], &
2285 work[iwork], &i__2, &ierr);
2287 /* Copy R to VT, zeroing out below it */
2289 clacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset],
2294 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &vt[
2295 vt_dim1 + 2], ldvt);
2302 /* Bidiagonalize R in VT */
2303 /* (CWorkspace: need 3*N, prefer 2*N+2*N*NB) */
2304 /* (RWorkspace: need N) */
2306 i__2 = *lwork - iwork + 1;
2307 cgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &rwork[ie],
2308 &work[itauq], &work[itaup], &work[iwork], &
2311 /* Multiply Q in U by left bidiagonalizing vectors */
2313 /* (CWorkspace: need 2*N+M, prefer 2*N+M*NB) */
2314 /* (RWorkspace: 0) */
2316 i__2 = *lwork - iwork + 1;
2317 cunmbr_("Q", "R", "N", m, n, n, &vt[vt_offset], ldvt,
2318 &work[itauq], &u[u_offset], ldu, &work[iwork],
2321 /* Generate right bidiagonalizing vectors in VT */
2322 /* (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB) */
2323 /* (RWorkspace: 0) */
2325 i__2 = *lwork - iwork + 1;
2326 cungbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[
2327 itaup], &work[iwork], &i__2, &ierr)
2331 /* Perform bidiagonal QR iteration, computing left */
2332 /* singular vectors of A in U and computing right */
2333 /* singular vectors of A in VT */
2334 /* (CWorkspace: 0) */
2335 /* (RWorkspace: need BDSPAC) */
2337 cbdsqr_("U", n, n, m, &c__0, &s[1], &rwork[ie], &vt[
2338 vt_offset], ldvt, &u[u_offset], ldu, cdum, &
2339 c__1, &rwork[irwork], info);
2349 /* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */
2350 /* M left singular vectors to be computed in U and */
2351 /* no right singular vectors to be computed */
2354 i__2 = *n + *m, i__3 = *n * 3;
2355 if (*lwork >= *n * *n + f2cmax(i__2,i__3)) {
2357 /* Sufficient workspace for a fast algorithm */
2360 if (*lwork >= wrkbl + *lda * *n) {
2362 /* WORK(IR) is LDA by N */
2367 /* WORK(IR) is N by N */
2371 itau = ir + ldwrkr * *n;
2374 /* Compute A=Q*R, copying result to U */
2375 /* (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB) */
2376 /* (RWorkspace: 0) */
2378 i__2 = *lwork - iwork + 1;
2379 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2380 iwork], &i__2, &ierr);
2381 clacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2384 /* Copy R to WORK(IR), zeroing out below it */
2386 clacpy_("U", n, n, &a[a_offset], lda, &work[ir], &
2390 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &work[ir + 1]
2393 /* Generate Q in U */
2394 /* (CWorkspace: need N*N+N+M, prefer N*N+N+M*NB) */
2395 /* (RWorkspace: 0) */
2397 i__2 = *lwork - iwork + 1;
2398 cungqr_(m, m, n, &u[u_offset], ldu, &work[itau], &
2399 work[iwork], &i__2, &ierr);
2405 /* Bidiagonalize R in WORK(IR) */
2406 /* (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB) */
2407 /* (RWorkspace: need N) */
2409 i__2 = *lwork - iwork + 1;
2410 cgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &rwork[ie], &
2411 work[itauq], &work[itaup], &work[iwork], &
2414 /* Generate left bidiagonalizing vectors in WORK(IR) */
2415 /* (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB) */
2416 /* (RWorkspace: 0) */
2418 i__2 = *lwork - iwork + 1;
2419 cungbr_("Q", n, n, n, &work[ir], &ldwrkr, &work[itauq]
2420 , &work[iwork], &i__2, &ierr);
2423 /* Perform bidiagonal QR iteration, computing left */
2424 /* singular vectors of R in WORK(IR) */
2425 /* (CWorkspace: need N*N) */
2426 /* (RWorkspace: need BDSPAC) */
2428 cbdsqr_("U", n, &c__0, n, &c__0, &s[1], &rwork[ie],
2429 cdum, &c__1, &work[ir], &ldwrkr, cdum, &c__1,
2430 &rwork[irwork], info);
2432 /* Multiply Q in U by left singular vectors of R in */
2433 /* WORK(IR), storing result in A */
2434 /* (CWorkspace: need N*N) */
2435 /* (RWorkspace: 0) */
2437 cgemm_("N", "N", m, n, n, &c_b2, &u[u_offset], ldu, &
2438 work[ir], &ldwrkr, &c_b1, &a[a_offset], lda);
2440 /* Copy left singular vectors of A from A to U */
2442 clacpy_("F", m, n, &a[a_offset], lda, &u[u_offset],
2447 /* Insufficient workspace for a fast algorithm */
2452 /* Compute A=Q*R, copying result to U */
2453 /* (CWorkspace: need 2*N, prefer N+N*NB) */
2454 /* (RWorkspace: 0) */
2456 i__2 = *lwork - iwork + 1;
2457 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2458 iwork], &i__2, &ierr);
2459 clacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2462 /* Generate Q in U */
2463 /* (CWorkspace: need N+M, prefer N+M*NB) */
2464 /* (RWorkspace: 0) */
2466 i__2 = *lwork - iwork + 1;
2467 cungqr_(m, m, n, &u[u_offset], ldu, &work[itau], &
2468 work[iwork], &i__2, &ierr);
2474 /* Zero out below R in A */
2479 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &a[
2483 /* Bidiagonalize R in A */
2484 /* (CWorkspace: need 3*N, prefer 2*N+2*N*NB) */
2485 /* (RWorkspace: need N) */
2487 i__2 = *lwork - iwork + 1;
2488 cgebrd_(n, n, &a[a_offset], lda, &s[1], &rwork[ie], &
2489 work[itauq], &work[itaup], &work[iwork], &
2492 /* Multiply Q in U by left bidiagonalizing vectors */
2494 /* (CWorkspace: need 2*N+M, prefer 2*N+M*NB) */
2495 /* (RWorkspace: 0) */
2497 i__2 = *lwork - iwork + 1;
2498 cunmbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, &
2499 work[itauq], &u[u_offset], ldu, &work[iwork],
2504 /* Perform bidiagonal QR iteration, computing left */
2505 /* singular vectors of A in U */
2506 /* (CWorkspace: 0) */
2507 /* (RWorkspace: need BDSPAC) */
2509 cbdsqr_("U", n, &c__0, m, &c__0, &s[1], &rwork[ie],
2510 cdum, &c__1, &u[u_offset], ldu, cdum, &c__1, &
2511 rwork[irwork], info);
2517 /* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */
2518 /* M left singular vectors to be computed in U and */
2519 /* N right singular vectors to be overwritten on A */
2522 i__2 = *n + *m, i__3 = *n * 3;
2523 if (*lwork >= (*n << 1) * *n + f2cmax(i__2,i__3)) {
2525 /* Sufficient workspace for a fast algorithm */
2528 if (*lwork >= wrkbl + (*lda << 1) * *n) {
2530 /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */
2533 ir = iu + ldwrku * *n;
2535 } else if (*lwork >= wrkbl + (*lda + *n) * *n) {
2537 /* WORK(IU) is LDA by N and WORK(IR) is N by N */
2540 ir = iu + ldwrku * *n;
2544 /* WORK(IU) is N by N and WORK(IR) is N by N */
2547 ir = iu + ldwrku * *n;
2550 itau = ir + ldwrkr * *n;
2553 /* Compute A=Q*R, copying result to U */
2554 /* (CWorkspace: need 2*N*N+2*N, prefer 2*N*N+N+N*NB) */
2555 /* (RWorkspace: 0) */
2557 i__2 = *lwork - iwork + 1;
2558 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2559 iwork], &i__2, &ierr);
2560 clacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2563 /* Generate Q in U */
2564 /* (CWorkspace: need 2*N*N+N+M, prefer 2*N*N+N+M*NB) */
2565 /* (RWorkspace: 0) */
2567 i__2 = *lwork - iwork + 1;
2568 cungqr_(m, m, n, &u[u_offset], ldu, &work[itau], &
2569 work[iwork], &i__2, &ierr);
2571 /* Copy R to WORK(IU), zeroing out below it */
2573 clacpy_("U", n, n, &a[a_offset], lda, &work[iu], &
2577 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &work[iu + 1]
2584 /* Bidiagonalize R in WORK(IU), copying result to */
2586 /* (CWorkspace: need 2*N*N+3*N, */
2587 /* prefer 2*N*N+2*N+2*N*NB) */
2588 /* (RWorkspace: need N) */
2590 i__2 = *lwork - iwork + 1;
2591 cgebrd_(n, n, &work[iu], &ldwrku, &s[1], &rwork[ie], &
2592 work[itauq], &work[itaup], &work[iwork], &
2594 clacpy_("U", n, n, &work[iu], &ldwrku, &work[ir], &
2597 /* Generate left bidiagonalizing vectors in WORK(IU) */
2598 /* (CWorkspace: need 2*N*N+3*N, prefer 2*N*N+2*N+N*NB) */
2599 /* (RWorkspace: 0) */
2601 i__2 = *lwork - iwork + 1;
2602 cungbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq]
2603 , &work[iwork], &i__2, &ierr);
2605 /* Generate right bidiagonalizing vectors in WORK(IR) */
2606 /* (CWorkspace: need 2*N*N+3*N-1, */
2607 /* prefer 2*N*N+2*N+(N-1)*NB) */
2608 /* (RWorkspace: 0) */
2610 i__2 = *lwork - iwork + 1;
2611 cungbr_("P", n, n, n, &work[ir], &ldwrkr, &work[itaup]
2612 , &work[iwork], &i__2, &ierr);
2615 /* Perform bidiagonal QR iteration, computing left */
2616 /* singular vectors of R in WORK(IU) and computing */
2617 /* right singular vectors of R in WORK(IR) */
2618 /* (CWorkspace: need 2*N*N) */
2619 /* (RWorkspace: need BDSPAC) */
2621 cbdsqr_("U", n, n, n, &c__0, &s[1], &rwork[ie], &work[
2622 ir], &ldwrkr, &work[iu], &ldwrku, cdum, &c__1,
2623 &rwork[irwork], info);
2625 /* Multiply Q in U by left singular vectors of R in */
2626 /* WORK(IU), storing result in A */
2627 /* (CWorkspace: need N*N) */
2628 /* (RWorkspace: 0) */
2630 cgemm_("N", "N", m, n, n, &c_b2, &u[u_offset], ldu, &
2631 work[iu], &ldwrku, &c_b1, &a[a_offset], lda);
2633 /* Copy left singular vectors of A from A to U */
2635 clacpy_("F", m, n, &a[a_offset], lda, &u[u_offset],
2638 /* Copy right singular vectors of R from WORK(IR) to A */
2640 clacpy_("F", n, n, &work[ir], &ldwrkr, &a[a_offset],
2645 /* Insufficient workspace for a fast algorithm */
2650 /* Compute A=Q*R, copying result to U */
2651 /* (CWorkspace: need 2*N, prefer N+N*NB) */
2652 /* (RWorkspace: 0) */
2654 i__2 = *lwork - iwork + 1;
2655 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2656 iwork], &i__2, &ierr);
2657 clacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2660 /* Generate Q in U */
2661 /* (CWorkspace: need N+M, prefer N+M*NB) */
2662 /* (RWorkspace: 0) */
2664 i__2 = *lwork - iwork + 1;
2665 cungqr_(m, m, n, &u[u_offset], ldu, &work[itau], &
2666 work[iwork], &i__2, &ierr);
2672 /* Zero out below R in A */
2677 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &a[
2681 /* Bidiagonalize R in A */
2682 /* (CWorkspace: need 3*N, prefer 2*N+2*N*NB) */
2683 /* (RWorkspace: need N) */
2685 i__2 = *lwork - iwork + 1;
2686 cgebrd_(n, n, &a[a_offset], lda, &s[1], &rwork[ie], &
2687 work[itauq], &work[itaup], &work[iwork], &
2690 /* Multiply Q in U by left bidiagonalizing vectors */
2692 /* (CWorkspace: need 2*N+M, prefer 2*N+M*NB) */
2693 /* (RWorkspace: 0) */
2695 i__2 = *lwork - iwork + 1;
2696 cunmbr_("Q", "R", "N", m, n, n, &a[a_offset], lda, &
2697 work[itauq], &u[u_offset], ldu, &work[iwork],
2701 /* Generate right bidiagonalizing vectors in A */
2702 /* (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB) */
2703 /* (RWorkspace: 0) */
2705 i__2 = *lwork - iwork + 1;
2706 cungbr_("P", n, n, n, &a[a_offset], lda, &work[itaup],
2707 &work[iwork], &i__2, &ierr);
2710 /* Perform bidiagonal QR iteration, computing left */
2711 /* singular vectors of A in U and computing right */
2712 /* singular vectors of A in A */
2713 /* (CWorkspace: 0) */
2714 /* (RWorkspace: need BDSPAC) */
2716 cbdsqr_("U", n, n, m, &c__0, &s[1], &rwork[ie], &a[
2717 a_offset], lda, &u[u_offset], ldu, cdum, &
2718 c__1, &rwork[irwork], info);
2722 } else if (wntvas) {
2724 /* Path 9 (M much larger than N, JOBU='A', JOBVT='S' */
2726 /* M left singular vectors to be computed in U and */
2727 /* N right singular vectors to be computed in VT */
2730 i__2 = *n + *m, i__3 = *n * 3;
2731 if (*lwork >= *n * *n + f2cmax(i__2,i__3)) {
2733 /* Sufficient workspace for a fast algorithm */
2736 if (*lwork >= wrkbl + *lda * *n) {
2738 /* WORK(IU) is LDA by N */
2743 /* WORK(IU) is N by N */
2747 itau = iu + ldwrku * *n;
2750 /* Compute A=Q*R, copying result to U */
2751 /* (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB) */
2752 /* (RWorkspace: 0) */
2754 i__2 = *lwork - iwork + 1;
2755 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2756 iwork], &i__2, &ierr);
2757 clacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2760 /* Generate Q in U */
2761 /* (CWorkspace: need N*N+N+M, prefer N*N+N+M*NB) */
2762 /* (RWorkspace: 0) */
2764 i__2 = *lwork - iwork + 1;
2765 cungqr_(m, m, n, &u[u_offset], ldu, &work[itau], &
2766 work[iwork], &i__2, &ierr);
2768 /* Copy R to WORK(IU), zeroing out below it */
2770 clacpy_("U", n, n, &a[a_offset], lda, &work[iu], &
2774 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &work[iu + 1]
2781 /* Bidiagonalize R in WORK(IU), copying result to VT */
2782 /* (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB) */
2783 /* (RWorkspace: need N) */
2785 i__2 = *lwork - iwork + 1;
2786 cgebrd_(n, n, &work[iu], &ldwrku, &s[1], &rwork[ie], &
2787 work[itauq], &work[itaup], &work[iwork], &
2789 clacpy_("U", n, n, &work[iu], &ldwrku, &vt[vt_offset],
2792 /* Generate left bidiagonalizing vectors in WORK(IU) */
2793 /* (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB) */
2794 /* (RWorkspace: 0) */
2796 i__2 = *lwork - iwork + 1;
2797 cungbr_("Q", n, n, n, &work[iu], &ldwrku, &work[itauq]
2798 , &work[iwork], &i__2, &ierr);
2800 /* Generate right bidiagonalizing vectors in VT */
2801 /* (CWorkspace: need N*N+3*N-1, */
2802 /* prefer N*N+2*N+(N-1)*NB) */
2803 /* (RWorkspace: need 0) */
2805 i__2 = *lwork - iwork + 1;
2806 cungbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[
2807 itaup], &work[iwork], &i__2, &ierr)
2811 /* Perform bidiagonal QR iteration, computing left */
2812 /* singular vectors of R in WORK(IU) and computing */
2813 /* right singular vectors of R in VT */
2814 /* (CWorkspace: need N*N) */
2815 /* (RWorkspace: need BDSPAC) */
2817 cbdsqr_("U", n, n, n, &c__0, &s[1], &rwork[ie], &vt[
2818 vt_offset], ldvt, &work[iu], &ldwrku, cdum, &
2819 c__1, &rwork[irwork], info);
2821 /* Multiply Q in U by left singular vectors of R in */
2822 /* WORK(IU), storing result in A */
2823 /* (CWorkspace: need N*N) */
2824 /* (RWorkspace: 0) */
2826 cgemm_("N", "N", m, n, n, &c_b2, &u[u_offset], ldu, &
2827 work[iu], &ldwrku, &c_b1, &a[a_offset], lda);
2829 /* Copy left singular vectors of A from A to U */
2831 clacpy_("F", m, n, &a[a_offset], lda, &u[u_offset],
2836 /* Insufficient workspace for a fast algorithm */
2841 /* Compute A=Q*R, copying result to U */
2842 /* (CWorkspace: need 2*N, prefer N+N*NB) */
2843 /* (RWorkspace: 0) */
2845 i__2 = *lwork - iwork + 1;
2846 cgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[
2847 iwork], &i__2, &ierr);
2848 clacpy_("L", m, n, &a[a_offset], lda, &u[u_offset],
2851 /* Generate Q in U */
2852 /* (CWorkspace: need N+M, prefer N+M*NB) */
2853 /* (RWorkspace: 0) */
2855 i__2 = *lwork - iwork + 1;
2856 cungqr_(m, m, n, &u[u_offset], ldu, &work[itau], &
2857 work[iwork], &i__2, &ierr);
2859 /* Copy R from A to VT, zeroing out below it */
2861 clacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset],
2866 claset_("L", &i__2, &i__3, &c_b1, &c_b1, &vt[
2867 vt_dim1 + 2], ldvt);
2874 /* Bidiagonalize R in VT */
2875 /* (CWorkspace: need 3*N, prefer 2*N+2*N*NB) */
2876 /* (RWorkspace: need N) */
2878 i__2 = *lwork - iwork + 1;
2879 cgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &rwork[ie],
2880 &work[itauq], &work[itaup], &work[iwork], &
2883 /* Multiply Q in U by left bidiagonalizing vectors */
2885 /* (CWorkspace: need 2*N+M, prefer 2*N+M*NB) */
2886 /* (RWorkspace: 0) */
2888 i__2 = *lwork - iwork + 1;
2889 cunmbr_("Q", "R", "N", m, n, n, &vt[vt_offset], ldvt,
2890 &work[itauq], &u[u_offset], ldu, &work[iwork],
2893 /* Generate right bidiagonalizing vectors in VT */
2894 /* (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB) */
2895 /* (RWorkspace: 0) */
2897 i__2 = *lwork - iwork + 1;
2898 cungbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[
2899 itaup], &work[iwork], &i__2, &ierr)
2903 /* Perform bidiagonal QR iteration, computing left */
2904 /* singular vectors of A in U and computing right */
2905 /* singular vectors of A in VT */
2906 /* (CWorkspace: 0) */
2907 /* (RWorkspace: need BDSPAC) */
2909 cbdsqr_("U", n, n, m, &c__0, &s[1], &rwork[ie], &vt[
2910 vt_offset], ldvt, &u[u_offset], ldu, cdum, &
2911 c__1, &rwork[irwork], info);
2923 /* Path 10 (M at least N, but not much larger) */
2924 /* Reduce to bidiagonal form without QR decomposition */
2931 /* Bidiagonalize A */
2932 /* (CWorkspace: need 2*N+M, prefer 2*N+(M+N)*NB) */
2933 /* (RWorkspace: need N) */
2935 i__2 = *lwork - iwork + 1;
2936 cgebrd_(m, n, &a[a_offset], lda, &s[1], &rwork[ie], &work[itauq],
2937 &work[itaup], &work[iwork], &i__2, &ierr);
2940 /* If left singular vectors desired in U, copy result to U */
2941 /* and generate left bidiagonalizing vectors in U */
2942 /* (CWorkspace: need 2*N+NCU, prefer 2*N+NCU*NB) */
2943 /* (RWorkspace: 0) */
2945 clacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu);
2952 i__2 = *lwork - iwork + 1;
2953 cungbr_("Q", m, &ncu, n, &u[u_offset], ldu, &work[itauq], &
2954 work[iwork], &i__2, &ierr);
2958 /* If right singular vectors desired in VT, copy result to */
2959 /* VT and generate right bidiagonalizing vectors in VT */
2960 /* (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB) */
2961 /* (RWorkspace: 0) */
2963 clacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
2964 i__2 = *lwork - iwork + 1;
2965 cungbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &
2966 work[iwork], &i__2, &ierr);
2970 /* If left singular vectors desired in A, generate left */
2971 /* bidiagonalizing vectors in A */
2972 /* (CWorkspace: need 3*N, prefer 2*N+N*NB) */
2973 /* (RWorkspace: 0) */
2975 i__2 = *lwork - iwork + 1;
2976 cungbr_("Q", m, n, n, &a[a_offset], lda, &work[itauq], &work[
2977 iwork], &i__2, &ierr);
2981 /* If right singular vectors desired in A, generate right */
2982 /* bidiagonalizing vectors in A */
2983 /* (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB) */
2984 /* (RWorkspace: 0) */
2986 i__2 = *lwork - iwork + 1;
2987 cungbr_("P", n, n, n, &a[a_offset], lda, &work[itaup], &work[
2988 iwork], &i__2, &ierr);
2991 if (wntuas || wntuo) {
2997 if (wntvas || wntvo) {
3003 if (! wntuo && ! wntvo) {
3005 /* Perform bidiagonal QR iteration, if desired, computing */
3006 /* left singular vectors in U and computing right singular */
3008 /* (CWorkspace: 0) */
3009 /* (RWorkspace: need BDSPAC) */
3011 cbdsqr_("U", n, &ncvt, &nru, &c__0, &s[1], &rwork[ie], &vt[
3012 vt_offset], ldvt, &u[u_offset], ldu, cdum, &c__1, &
3013 rwork[irwork], info);
3014 } else if (! wntuo && wntvo) {
3016 /* Perform bidiagonal QR iteration, if desired, computing */
3017 /* left singular vectors in U and computing right singular */
3019 /* (CWorkspace: 0) */
3020 /* (RWorkspace: need BDSPAC) */
3022 cbdsqr_("U", n, &ncvt, &nru, &c__0, &s[1], &rwork[ie], &a[
3023 a_offset], lda, &u[u_offset], ldu, cdum, &c__1, &
3024 rwork[irwork], info);
3027 /* Perform bidiagonal QR iteration, if desired, computing */
3028 /* left singular vectors in A and computing right singular */
3030 /* (CWorkspace: 0) */
3031 /* (RWorkspace: need BDSPAC) */
3033 cbdsqr_("U", n, &ncvt, &nru, &c__0, &s[1], &rwork[ie], &vt[
3034 vt_offset], ldvt, &a[a_offset], lda, cdum, &c__1, &
3035 rwork[irwork], info);
3042 /* A has more columns than rows. If A has sufficiently more */
3043 /* columns than rows, first reduce using the LQ decomposition (if */
3044 /* sufficient workspace available) */
3050 /* Path 1t(N much larger than M, JOBVT='N') */
3051 /* No right singular vectors to be computed */
3057 /* (CWorkspace: need 2*M, prefer M+M*NB) */
3058 /* (RWorkspace: 0) */
3060 i__2 = *lwork - iwork + 1;
3061 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &
3064 /* Zero out above L */
3068 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &a[(a_dim1 << 1) + 1]
3075 /* Bidiagonalize L in A */
3076 /* (CWorkspace: need 3*M, prefer 2*M+2*M*NB) */
3077 /* (RWorkspace: need M) */
3079 i__2 = *lwork - iwork + 1;
3080 cgebrd_(m, m, &a[a_offset], lda, &s[1], &rwork[ie], &work[
3081 itauq], &work[itaup], &work[iwork], &i__2, &ierr);
3082 if (wntuo || wntuas) {
3084 /* If left singular vectors desired, generate Q */
3085 /* (CWorkspace: need 3*M, prefer 2*M+M*NB) */
3086 /* (RWorkspace: 0) */
3088 i__2 = *lwork - iwork + 1;
3089 cungbr_("Q", m, m, m, &a[a_offset], lda, &work[itauq], &
3090 work[iwork], &i__2, &ierr);
3094 if (wntuo || wntuas) {
3098 /* Perform bidiagonal QR iteration, computing left singular */
3099 /* vectors of A in A if desired */
3100 /* (CWorkspace: 0) */
3101 /* (RWorkspace: need BDSPAC) */
3103 cbdsqr_("U", m, &c__0, &nru, &c__0, &s[1], &rwork[ie], cdum, &
3104 c__1, &a[a_offset], lda, cdum, &c__1, &rwork[irwork],
3107 /* If left singular vectors desired in U, copy them there */
3110 clacpy_("F", m, m, &a[a_offset], lda, &u[u_offset], ldu);
3113 } else if (wntvo && wntun) {
3115 /* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */
3116 /* M right singular vectors to be overwritten on A and */
3117 /* no left singular vectors to be computed */
3119 if (*lwork >= *m * *m + *m * 3) {
3121 /* Sufficient workspace for a fast algorithm */
3125 i__2 = wrkbl, i__3 = *lda * *n;
3126 if (*lwork >= f2cmax(i__2,i__3) + *lda * *m) {
3128 /* WORK(IU) is LDA by N and WORK(IR) is LDA by M */
3133 } else /* if(complicated condition) */ {
3135 i__2 = wrkbl, i__3 = *lda * *n;
3136 if (*lwork >= f2cmax(i__2,i__3) + *m * *m) {
3138 /* WORK(IU) is LDA by N and WORK(IR) is M by M */
3145 /* WORK(IU) is M by CHUNK and WORK(IR) is M by M */
3148 chunk = (*lwork - *m * *m) / *m;
3152 itau = ir + ldwrkr * *m;
3156 /* (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB) */
3157 /* (RWorkspace: 0) */
3159 i__2 = *lwork - iwork + 1;
3160 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork]
3163 /* Copy L to WORK(IR) and zero out above it */
3165 clacpy_("L", m, m, &a[a_offset], lda, &work[ir], &ldwrkr);
3168 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &work[ir +
3171 /* Generate Q in A */
3172 /* (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB) */
3173 /* (RWorkspace: 0) */
3175 i__2 = *lwork - iwork + 1;
3176 cunglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[
3177 iwork], &i__2, &ierr);
3183 /* Bidiagonalize L in WORK(IR) */
3184 /* (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB) */
3185 /* (RWorkspace: need M) */
3187 i__2 = *lwork - iwork + 1;
3188 cgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &rwork[ie], &
3189 work[itauq], &work[itaup], &work[iwork], &i__2, &
3192 /* Generate right vectors bidiagonalizing L */
3193 /* (CWorkspace: need M*M+3*M-1, prefer M*M+2*M+(M-1)*NB) */
3194 /* (RWorkspace: 0) */
3196 i__2 = *lwork - iwork + 1;
3197 cungbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup], &
3198 work[iwork], &i__2, &ierr);
3201 /* Perform bidiagonal QR iteration, computing right */
3202 /* singular vectors of L in WORK(IR) */
3203 /* (CWorkspace: need M*M) */
3204 /* (RWorkspace: need BDSPAC) */
3206 cbdsqr_("U", m, m, &c__0, &c__0, &s[1], &rwork[ie], &work[
3207 ir], &ldwrkr, cdum, &c__1, cdum, &c__1, &rwork[
3211 /* Multiply right singular vectors of L in WORK(IR) by Q */
3212 /* in A, storing result in WORK(IU) and copying to A */
3213 /* (CWorkspace: need M*M+M, prefer M*M+M*N) */
3214 /* (RWorkspace: 0) */
3218 for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ +=
3221 i__4 = *n - i__ + 1;
3222 blk = f2cmin(i__4,chunk);
3223 cgemm_("N", "N", m, &blk, m, &c_b2, &work[ir], &
3224 ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b1, &
3226 clacpy_("F", m, &blk, &work[iu], &ldwrku, &a[i__ *
3233 /* Insufficient workspace for a fast algorithm */
3240 /* Bidiagonalize A */
3241 /* (CWorkspace: need 2*M+N, prefer 2*M+(M+N)*NB) */
3242 /* (RWorkspace: need M) */
3244 i__3 = *lwork - iwork + 1;
3245 cgebrd_(m, n, &a[a_offset], lda, &s[1], &rwork[ie], &work[
3246 itauq], &work[itaup], &work[iwork], &i__3, &ierr);
3248 /* Generate right vectors bidiagonalizing A */
3249 /* (CWorkspace: need 3*M, prefer 2*M+M*NB) */
3250 /* (RWorkspace: 0) */
3252 i__3 = *lwork - iwork + 1;
3253 cungbr_("P", m, n, m, &a[a_offset], lda, &work[itaup], &
3254 work[iwork], &i__3, &ierr);
3257 /* Perform bidiagonal QR iteration, computing right */
3258 /* singular vectors of A in A */
3259 /* (CWorkspace: 0) */
3260 /* (RWorkspace: need BDSPAC) */
3262 cbdsqr_("L", m, n, &c__0, &c__0, &s[1], &rwork[ie], &a[
3263 a_offset], lda, cdum, &c__1, cdum, &c__1, &rwork[
3268 } else if (wntvo && wntuas) {
3270 /* Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O') */
3271 /* M right singular vectors to be overwritten on A and */
3272 /* M left singular vectors to be computed in U */
3274 if (*lwork >= *m * *m + *m * 3) {
3276 /* Sufficient workspace for a fast algorithm */
3280 i__3 = wrkbl, i__2 = *lda * *n;
3281 if (*lwork >= f2cmax(i__3,i__2) + *lda * *m) {
3283 /* WORK(IU) is LDA by N and WORK(IR) is LDA by M */
3288 } else /* if(complicated condition) */ {
3290 i__3 = wrkbl, i__2 = *lda * *n;
3291 if (*lwork >= f2cmax(i__3,i__2) + *m * *m) {
3293 /* WORK(IU) is LDA by N and WORK(IR) is M by M */
3300 /* WORK(IU) is M by CHUNK and WORK(IR) is M by M */
3303 chunk = (*lwork - *m * *m) / *m;
3307 itau = ir + ldwrkr * *m;
3311 /* (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB) */
3312 /* (RWorkspace: 0) */
3314 i__3 = *lwork - iwork + 1;
3315 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork]
3318 /* Copy L to U, zeroing about above it */
3320 clacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu);
3323 claset_("U", &i__3, &i__2, &c_b1, &c_b1, &u[(u_dim1 << 1)
3326 /* Generate Q in A */
3327 /* (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB) */
3328 /* (RWorkspace: 0) */
3330 i__3 = *lwork - iwork + 1;
3331 cunglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[
3332 iwork], &i__3, &ierr);
3338 /* Bidiagonalize L in U, copying result to WORK(IR) */
3339 /* (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB) */
3340 /* (RWorkspace: need M) */
3342 i__3 = *lwork - iwork + 1;
3343 cgebrd_(m, m, &u[u_offset], ldu, &s[1], &rwork[ie], &work[
3344 itauq], &work[itaup], &work[iwork], &i__3, &ierr);
3345 clacpy_("U", m, m, &u[u_offset], ldu, &work[ir], &ldwrkr);
3347 /* Generate right vectors bidiagonalizing L in WORK(IR) */
3348 /* (CWorkspace: need M*M+3*M-1, prefer M*M+2*M+(M-1)*NB) */
3349 /* (RWorkspace: 0) */
3351 i__3 = *lwork - iwork + 1;
3352 cungbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup], &
3353 work[iwork], &i__3, &ierr);
3355 /* Generate left vectors bidiagonalizing L in U */
3356 /* (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB) */
3357 /* (RWorkspace: 0) */
3359 i__3 = *lwork - iwork + 1;
3360 cungbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], &
3361 work[iwork], &i__3, &ierr);
3364 /* Perform bidiagonal QR iteration, computing left */
3365 /* singular vectors of L in U, and computing right */
3366 /* singular vectors of L in WORK(IR) */
3367 /* (CWorkspace: need M*M) */
3368 /* (RWorkspace: need BDSPAC) */
3370 cbdsqr_("U", m, m, m, &c__0, &s[1], &rwork[ie], &work[ir],
3371 &ldwrkr, &u[u_offset], ldu, cdum, &c__1, &rwork[
3375 /* Multiply right singular vectors of L in WORK(IR) by Q */
3376 /* in A, storing result in WORK(IU) and copying to A */
3377 /* (CWorkspace: need M*M+M, prefer M*M+M*N)) */
3378 /* (RWorkspace: 0) */
3382 for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ +=
3385 i__4 = *n - i__ + 1;
3386 blk = f2cmin(i__4,chunk);
3387 cgemm_("N", "N", m, &blk, m, &c_b2, &work[ir], &
3388 ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b1, &
3390 clacpy_("F", m, &blk, &work[iu], &ldwrku, &a[i__ *
3397 /* Insufficient workspace for a fast algorithm */
3403 /* (CWorkspace: need 2*M, prefer M+M*NB) */
3404 /* (RWorkspace: 0) */
3406 i__2 = *lwork - iwork + 1;
3407 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork]
3410 /* Copy L to U, zeroing out above it */
3412 clacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu);
3415 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &u[(u_dim1 << 1)
3418 /* Generate Q in A */
3419 /* (CWorkspace: need 2*M, prefer M+M*NB) */
3420 /* (RWorkspace: 0) */
3422 i__2 = *lwork - iwork + 1;
3423 cunglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[
3424 iwork], &i__2, &ierr);
3430 /* Bidiagonalize L in U */
3431 /* (CWorkspace: need 3*M, prefer 2*M+2*M*NB) */
3432 /* (RWorkspace: need M) */
3434 i__2 = *lwork - iwork + 1;
3435 cgebrd_(m, m, &u[u_offset], ldu, &s[1], &rwork[ie], &work[
3436 itauq], &work[itaup], &work[iwork], &i__2, &ierr);
3438 /* Multiply right vectors bidiagonalizing L by Q in A */
3439 /* (CWorkspace: need 2*M+N, prefer 2*M+N*NB) */
3440 /* (RWorkspace: 0) */
3442 i__2 = *lwork - iwork + 1;
3443 cunmbr_("P", "L", "C", m, n, m, &u[u_offset], ldu, &work[
3444 itaup], &a[a_offset], lda, &work[iwork], &i__2, &
3447 /* Generate left vectors bidiagonalizing L in U */
3448 /* (CWorkspace: need 3*M, prefer 2*M+M*NB) */
3449 /* (RWorkspace: 0) */
3451 i__2 = *lwork - iwork + 1;
3452 cungbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq], &
3453 work[iwork], &i__2, &ierr);
3456 /* Perform bidiagonal QR iteration, computing left */
3457 /* singular vectors of A in U and computing right */
3458 /* singular vectors of A in A */
3459 /* (CWorkspace: 0) */
3460 /* (RWorkspace: need BDSPAC) */
3462 cbdsqr_("U", m, n, m, &c__0, &s[1], &rwork[ie], &a[
3463 a_offset], lda, &u[u_offset], ldu, cdum, &c__1, &
3464 rwork[irwork], info);
3472 /* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */
3473 /* M right singular vectors to be computed in VT and */
3474 /* no left singular vectors to be computed */
3476 if (*lwork >= *m * *m + *m * 3) {
3478 /* Sufficient workspace for a fast algorithm */
3481 if (*lwork >= wrkbl + *lda * *m) {
3483 /* WORK(IR) is LDA by M */
3488 /* WORK(IR) is M by M */
3492 itau = ir + ldwrkr * *m;
3496 /* (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB) */
3497 /* (RWorkspace: 0) */
3499 i__2 = *lwork - iwork + 1;
3500 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3501 iwork], &i__2, &ierr);
3503 /* Copy L to WORK(IR), zeroing out above it */
3505 clacpy_("L", m, m, &a[a_offset], lda, &work[ir], &
3509 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &work[ir +
3512 /* Generate Q in A */
3513 /* (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB) */
3514 /* (RWorkspace: 0) */
3516 i__2 = *lwork - iwork + 1;
3517 cunglq_(m, n, m, &a[a_offset], lda, &work[itau], &
3518 work[iwork], &i__2, &ierr);
3524 /* Bidiagonalize L in WORK(IR) */
3525 /* (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB) */
3526 /* (RWorkspace: need M) */
3528 i__2 = *lwork - iwork + 1;
3529 cgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &rwork[ie], &
3530 work[itauq], &work[itaup], &work[iwork], &
3533 /* Generate right vectors bidiagonalizing L in */
3535 /* (CWorkspace: need M*M+3*M, prefer M*M+2*M+(M-1)*NB) */
3536 /* (RWorkspace: 0) */
3538 i__2 = *lwork - iwork + 1;
3539 cungbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup]
3540 , &work[iwork], &i__2, &ierr);
3543 /* Perform bidiagonal QR iteration, computing right */
3544 /* singular vectors of L in WORK(IR) */
3545 /* (CWorkspace: need M*M) */
3546 /* (RWorkspace: need BDSPAC) */
3548 cbdsqr_("U", m, m, &c__0, &c__0, &s[1], &rwork[ie], &
3549 work[ir], &ldwrkr, cdum, &c__1, cdum, &c__1, &
3550 rwork[irwork], info);
3552 /* Multiply right singular vectors of L in WORK(IR) by */
3553 /* Q in A, storing result in VT */
3554 /* (CWorkspace: need M*M) */
3555 /* (RWorkspace: 0) */
3557 cgemm_("N", "N", m, n, m, &c_b2, &work[ir], &ldwrkr, &
3558 a[a_offset], lda, &c_b1, &vt[vt_offset], ldvt);
3562 /* Insufficient workspace for a fast algorithm */
3568 /* (CWorkspace: need 2*M, prefer M+M*NB) */
3569 /* (RWorkspace: 0) */
3571 i__2 = *lwork - iwork + 1;
3572 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3573 iwork], &i__2, &ierr);
3575 /* Copy result to VT */
3577 clacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
3580 /* Generate Q in VT */
3581 /* (CWorkspace: need 2*M, prefer M+M*NB) */
3582 /* (RWorkspace: 0) */
3584 i__2 = *lwork - iwork + 1;
3585 cunglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], &
3586 work[iwork], &i__2, &ierr);
3592 /* Zero out above L in A */
3596 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &a[(a_dim1 <<
3599 /* Bidiagonalize L in A */
3600 /* (CWorkspace: need 3*M, prefer 2*M+2*M*NB) */
3601 /* (RWorkspace: need M) */
3603 i__2 = *lwork - iwork + 1;
3604 cgebrd_(m, m, &a[a_offset], lda, &s[1], &rwork[ie], &
3605 work[itauq], &work[itaup], &work[iwork], &
3608 /* Multiply right vectors bidiagonalizing L by Q in VT */
3609 /* (CWorkspace: need 2*M+N, prefer 2*M+N*NB) */
3610 /* (RWorkspace: 0) */
3612 i__2 = *lwork - iwork + 1;
3613 cunmbr_("P", "L", "C", m, n, m, &a[a_offset], lda, &
3614 work[itaup], &vt[vt_offset], ldvt, &work[
3615 iwork], &i__2, &ierr);
3618 /* Perform bidiagonal QR iteration, computing right */
3619 /* singular vectors of A in VT */
3620 /* (CWorkspace: 0) */
3621 /* (RWorkspace: need BDSPAC) */
3623 cbdsqr_("U", m, n, &c__0, &c__0, &s[1], &rwork[ie], &
3624 vt[vt_offset], ldvt, cdum, &c__1, cdum, &c__1,
3625 &rwork[irwork], info);
3631 /* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */
3632 /* M right singular vectors to be computed in VT and */
3633 /* M left singular vectors to be overwritten on A */
3635 if (*lwork >= (*m << 1) * *m + *m * 3) {
3637 /* Sufficient workspace for a fast algorithm */
3640 if (*lwork >= wrkbl + (*lda << 1) * *m) {
3642 /* WORK(IU) is LDA by M and WORK(IR) is LDA by M */
3645 ir = iu + ldwrku * *m;
3647 } else if (*lwork >= wrkbl + (*lda + *m) * *m) {
3649 /* WORK(IU) is LDA by M and WORK(IR) is M by M */
3652 ir = iu + ldwrku * *m;
3656 /* WORK(IU) is M by M and WORK(IR) is M by M */
3659 ir = iu + ldwrku * *m;
3662 itau = ir + ldwrkr * *m;
3666 /* (CWorkspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB) */
3667 /* (RWorkspace: 0) */
3669 i__2 = *lwork - iwork + 1;
3670 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3671 iwork], &i__2, &ierr);
3673 /* Copy L to WORK(IU), zeroing out below it */
3675 clacpy_("L", m, m, &a[a_offset], lda, &work[iu], &
3679 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &work[iu +
3682 /* Generate Q in A */
3683 /* (CWorkspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB) */
3684 /* (RWorkspace: 0) */
3686 i__2 = *lwork - iwork + 1;
3687 cunglq_(m, n, m, &a[a_offset], lda, &work[itau], &
3688 work[iwork], &i__2, &ierr);
3694 /* Bidiagonalize L in WORK(IU), copying result to */
3696 /* (CWorkspace: need 2*M*M+3*M, */
3697 /* prefer 2*M*M+2*M+2*M*NB) */
3698 /* (RWorkspace: need M) */
3700 i__2 = *lwork - iwork + 1;
3701 cgebrd_(m, m, &work[iu], &ldwrku, &s[1], &rwork[ie], &
3702 work[itauq], &work[itaup], &work[iwork], &
3704 clacpy_("L", m, m, &work[iu], &ldwrku, &work[ir], &
3707 /* Generate right bidiagonalizing vectors in WORK(IU) */
3708 /* (CWorkspace: need 2*M*M+3*M-1, */
3709 /* prefer 2*M*M+2*M+(M-1)*NB) */
3710 /* (RWorkspace: 0) */
3712 i__2 = *lwork - iwork + 1;
3713 cungbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup]
3714 , &work[iwork], &i__2, &ierr);
3716 /* Generate left bidiagonalizing vectors in WORK(IR) */
3717 /* (CWorkspace: need 2*M*M+3*M, prefer 2*M*M+2*M+M*NB) */
3718 /* (RWorkspace: 0) */
3720 i__2 = *lwork - iwork + 1;
3721 cungbr_("Q", m, m, m, &work[ir], &ldwrkr, &work[itauq]
3722 , &work[iwork], &i__2, &ierr);
3725 /* Perform bidiagonal QR iteration, computing left */
3726 /* singular vectors of L in WORK(IR) and computing */
3727 /* right singular vectors of L in WORK(IU) */
3728 /* (CWorkspace: need 2*M*M) */
3729 /* (RWorkspace: need BDSPAC) */
3731 cbdsqr_("U", m, m, m, &c__0, &s[1], &rwork[ie], &work[
3732 iu], &ldwrku, &work[ir], &ldwrkr, cdum, &c__1,
3733 &rwork[irwork], info);
3735 /* Multiply right singular vectors of L in WORK(IU) by */
3736 /* Q in A, storing result in VT */
3737 /* (CWorkspace: need M*M) */
3738 /* (RWorkspace: 0) */
3740 cgemm_("N", "N", m, n, m, &c_b2, &work[iu], &ldwrku, &
3741 a[a_offset], lda, &c_b1, &vt[vt_offset], ldvt);
3743 /* Copy left singular vectors of L to A */
3744 /* (CWorkspace: need M*M) */
3745 /* (RWorkspace: 0) */
3747 clacpy_("F", m, m, &work[ir], &ldwrkr, &a[a_offset],
3752 /* Insufficient workspace for a fast algorithm */
3757 /* Compute A=L*Q, copying result to VT */
3758 /* (CWorkspace: need 2*M, prefer M+M*NB) */
3759 /* (RWorkspace: 0) */
3761 i__2 = *lwork - iwork + 1;
3762 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3763 iwork], &i__2, &ierr);
3764 clacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
3767 /* Generate Q in VT */
3768 /* (CWorkspace: need 2*M, prefer M+M*NB) */
3769 /* (RWorkspace: 0) */
3771 i__2 = *lwork - iwork + 1;
3772 cunglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], &
3773 work[iwork], &i__2, &ierr);
3779 /* Zero out above L in A */
3783 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &a[(a_dim1 <<
3786 /* Bidiagonalize L in A */
3787 /* (CWorkspace: need 3*M, prefer 2*M+2*M*NB) */
3788 /* (RWorkspace: need M) */
3790 i__2 = *lwork - iwork + 1;
3791 cgebrd_(m, m, &a[a_offset], lda, &s[1], &rwork[ie], &
3792 work[itauq], &work[itaup], &work[iwork], &
3795 /* Multiply right vectors bidiagonalizing L by Q in VT */
3796 /* (CWorkspace: need 2*M+N, prefer 2*M+N*NB) */
3797 /* (RWorkspace: 0) */
3799 i__2 = *lwork - iwork + 1;
3800 cunmbr_("P", "L", "C", m, n, m, &a[a_offset], lda, &
3801 work[itaup], &vt[vt_offset], ldvt, &work[
3802 iwork], &i__2, &ierr);
3804 /* Generate left bidiagonalizing vectors of L in A */
3805 /* (CWorkspace: need 3*M, prefer 2*M+M*NB) */
3806 /* (RWorkspace: 0) */
3808 i__2 = *lwork - iwork + 1;
3809 cungbr_("Q", m, m, m, &a[a_offset], lda, &work[itauq],
3810 &work[iwork], &i__2, &ierr);
3813 /* Perform bidiagonal QR iteration, computing left */
3814 /* singular vectors of A in A and computing right */
3815 /* singular vectors of A in VT */
3816 /* (CWorkspace: 0) */
3817 /* (RWorkspace: need BDSPAC) */
3819 cbdsqr_("U", m, n, m, &c__0, &s[1], &rwork[ie], &vt[
3820 vt_offset], ldvt, &a[a_offset], lda, cdum, &
3821 c__1, &rwork[irwork], info);
3825 } else if (wntuas) {
3827 /* Path 6t(N much larger than M, JOBU='S' or 'A', */
3829 /* M right singular vectors to be computed in VT and */
3830 /* M left singular vectors to be computed in U */
3832 if (*lwork >= *m * *m + *m * 3) {
3834 /* Sufficient workspace for a fast algorithm */
3837 if (*lwork >= wrkbl + *lda * *m) {
3839 /* WORK(IU) is LDA by N */
3844 /* WORK(IU) is LDA by M */
3848 itau = iu + ldwrku * *m;
3852 /* (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB) */
3853 /* (RWorkspace: 0) */
3855 i__2 = *lwork - iwork + 1;
3856 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3857 iwork], &i__2, &ierr);
3859 /* Copy L to WORK(IU), zeroing out above it */
3861 clacpy_("L", m, m, &a[a_offset], lda, &work[iu], &
3865 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &work[iu +
3868 /* Generate Q in A */
3869 /* (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB) */
3870 /* (RWorkspace: 0) */
3872 i__2 = *lwork - iwork + 1;
3873 cunglq_(m, n, m, &a[a_offset], lda, &work[itau], &
3874 work[iwork], &i__2, &ierr);
3880 /* Bidiagonalize L in WORK(IU), copying result to U */
3881 /* (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB) */
3882 /* (RWorkspace: need M) */
3884 i__2 = *lwork - iwork + 1;
3885 cgebrd_(m, m, &work[iu], &ldwrku, &s[1], &rwork[ie], &
3886 work[itauq], &work[itaup], &work[iwork], &
3888 clacpy_("L", m, m, &work[iu], &ldwrku, &u[u_offset],
3891 /* Generate right bidiagonalizing vectors in WORK(IU) */
3892 /* (CWorkspace: need M*M+3*M-1, */
3893 /* prefer M*M+2*M+(M-1)*NB) */
3894 /* (RWorkspace: 0) */
3896 i__2 = *lwork - iwork + 1;
3897 cungbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup]
3898 , &work[iwork], &i__2, &ierr);
3900 /* Generate left bidiagonalizing vectors in U */
3901 /* (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB) */
3902 /* (RWorkspace: 0) */
3904 i__2 = *lwork - iwork + 1;
3905 cungbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq],
3906 &work[iwork], &i__2, &ierr);
3909 /* Perform bidiagonal QR iteration, computing left */
3910 /* singular vectors of L in U and computing right */
3911 /* singular vectors of L in WORK(IU) */
3912 /* (CWorkspace: need M*M) */
3913 /* (RWorkspace: need BDSPAC) */
3915 cbdsqr_("U", m, m, m, &c__0, &s[1], &rwork[ie], &work[
3916 iu], &ldwrku, &u[u_offset], ldu, cdum, &c__1,
3917 &rwork[irwork], info);
3919 /* Multiply right singular vectors of L in WORK(IU) by */
3920 /* Q in A, storing result in VT */
3921 /* (CWorkspace: need M*M) */
3922 /* (RWorkspace: 0) */
3924 cgemm_("N", "N", m, n, m, &c_b2, &work[iu], &ldwrku, &
3925 a[a_offset], lda, &c_b1, &vt[vt_offset], ldvt);
3929 /* Insufficient workspace for a fast algorithm */
3934 /* Compute A=L*Q, copying result to VT */
3935 /* (CWorkspace: need 2*M, prefer M+M*NB) */
3936 /* (RWorkspace: 0) */
3938 i__2 = *lwork - iwork + 1;
3939 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
3940 iwork], &i__2, &ierr);
3941 clacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
3944 /* Generate Q in VT */
3945 /* (CWorkspace: need 2*M, prefer M+M*NB) */
3946 /* (RWorkspace: 0) */
3948 i__2 = *lwork - iwork + 1;
3949 cunglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], &
3950 work[iwork], &i__2, &ierr);
3952 /* Copy L to U, zeroing out above it */
3954 clacpy_("L", m, m, &a[a_offset], lda, &u[u_offset],
3958 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &u[(u_dim1 <<
3965 /* Bidiagonalize L in U */
3966 /* (CWorkspace: need 3*M, prefer 2*M+2*M*NB) */
3967 /* (RWorkspace: need M) */
3969 i__2 = *lwork - iwork + 1;
3970 cgebrd_(m, m, &u[u_offset], ldu, &s[1], &rwork[ie], &
3971 work[itauq], &work[itaup], &work[iwork], &
3974 /* Multiply right bidiagonalizing vectors in U by Q */
3976 /* (CWorkspace: need 2*M+N, prefer 2*M+N*NB) */
3977 /* (RWorkspace: 0) */
3979 i__2 = *lwork - iwork + 1;
3980 cunmbr_("P", "L", "C", m, n, m, &u[u_offset], ldu, &
3981 work[itaup], &vt[vt_offset], ldvt, &work[
3982 iwork], &i__2, &ierr);
3984 /* Generate left bidiagonalizing vectors in U */
3985 /* (CWorkspace: need 3*M, prefer 2*M+M*NB) */
3986 /* (RWorkspace: 0) */
3988 i__2 = *lwork - iwork + 1;
3989 cungbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq],
3990 &work[iwork], &i__2, &ierr);
3993 /* Perform bidiagonal QR iteration, computing left */
3994 /* singular vectors of A in U and computing right */
3995 /* singular vectors of A in VT */
3996 /* (CWorkspace: 0) */
3997 /* (RWorkspace: need BDSPAC) */
3999 cbdsqr_("U", m, n, m, &c__0, &s[1], &rwork[ie], &vt[
4000 vt_offset], ldvt, &u[u_offset], ldu, cdum, &
4001 c__1, &rwork[irwork], info);
4011 /* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */
4012 /* N right singular vectors to be computed in VT and */
4013 /* no left singular vectors to be computed */
4016 i__2 = *n + *m, i__3 = *m * 3;
4017 if (*lwork >= *m * *m + f2cmax(i__2,i__3)) {
4019 /* Sufficient workspace for a fast algorithm */
4022 if (*lwork >= wrkbl + *lda * *m) {
4024 /* WORK(IR) is LDA by M */
4029 /* WORK(IR) is M by M */
4033 itau = ir + ldwrkr * *m;
4036 /* Compute A=L*Q, copying result to VT */
4037 /* (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB) */
4038 /* (RWorkspace: 0) */
4040 i__2 = *lwork - iwork + 1;
4041 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
4042 iwork], &i__2, &ierr);
4043 clacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
4046 /* Copy L to WORK(IR), zeroing out above it */
4048 clacpy_("L", m, m, &a[a_offset], lda, &work[ir], &
4052 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &work[ir +
4055 /* Generate Q in VT */
4056 /* (CWorkspace: need M*M+M+N, prefer M*M+M+N*NB) */
4057 /* (RWorkspace: 0) */
4059 i__2 = *lwork - iwork + 1;
4060 cunglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &
4061 work[iwork], &i__2, &ierr);
4067 /* Bidiagonalize L in WORK(IR) */
4068 /* (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB) */
4069 /* (RWorkspace: need M) */
4071 i__2 = *lwork - iwork + 1;
4072 cgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &rwork[ie], &
4073 work[itauq], &work[itaup], &work[iwork], &
4076 /* Generate right bidiagonalizing vectors in WORK(IR) */
4077 /* (CWorkspace: need M*M+3*M-1, */
4078 /* prefer M*M+2*M+(M-1)*NB) */
4079 /* (RWorkspace: 0) */
4081 i__2 = *lwork - iwork + 1;
4082 cungbr_("P", m, m, m, &work[ir], &ldwrkr, &work[itaup]
4083 , &work[iwork], &i__2, &ierr);
4086 /* Perform bidiagonal QR iteration, computing right */
4087 /* singular vectors of L in WORK(IR) */
4088 /* (CWorkspace: need M*M) */
4089 /* (RWorkspace: need BDSPAC) */
4091 cbdsqr_("U", m, m, &c__0, &c__0, &s[1], &rwork[ie], &
4092 work[ir], &ldwrkr, cdum, &c__1, cdum, &c__1, &
4093 rwork[irwork], info);
4095 /* Multiply right singular vectors of L in WORK(IR) by */
4096 /* Q in VT, storing result in A */
4097 /* (CWorkspace: need M*M) */
4098 /* (RWorkspace: 0) */
4100 cgemm_("N", "N", m, n, m, &c_b2, &work[ir], &ldwrkr, &
4101 vt[vt_offset], ldvt, &c_b1, &a[a_offset], lda);
4103 /* Copy right singular vectors of A from A to VT */
4105 clacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset],
4110 /* Insufficient workspace for a fast algorithm */
4115 /* Compute A=L*Q, copying result to VT */
4116 /* (CWorkspace: need 2*M, prefer M+M*NB) */
4117 /* (RWorkspace: 0) */
4119 i__2 = *lwork - iwork + 1;
4120 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
4121 iwork], &i__2, &ierr);
4122 clacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
4125 /* Generate Q in VT */
4126 /* (CWorkspace: need M+N, prefer M+N*NB) */
4127 /* (RWorkspace: 0) */
4129 i__2 = *lwork - iwork + 1;
4130 cunglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &
4131 work[iwork], &i__2, &ierr);
4137 /* Zero out above L in A */
4141 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &a[(a_dim1 <<
4144 /* Bidiagonalize L in A */
4145 /* (CWorkspace: need 3*M, prefer 2*M+2*M*NB) */
4146 /* (RWorkspace: need M) */
4148 i__2 = *lwork - iwork + 1;
4149 cgebrd_(m, m, &a[a_offset], lda, &s[1], &rwork[ie], &
4150 work[itauq], &work[itaup], &work[iwork], &
4153 /* Multiply right bidiagonalizing vectors in A by Q */
4155 /* (CWorkspace: need 2*M+N, prefer 2*M+N*NB) */
4156 /* (RWorkspace: 0) */
4158 i__2 = *lwork - iwork + 1;
4159 cunmbr_("P", "L", "C", m, n, m, &a[a_offset], lda, &
4160 work[itaup], &vt[vt_offset], ldvt, &work[
4161 iwork], &i__2, &ierr);
4164 /* Perform bidiagonal QR iteration, computing right */
4165 /* singular vectors of A in VT */
4166 /* (CWorkspace: 0) */
4167 /* (RWorkspace: need BDSPAC) */
4169 cbdsqr_("U", m, n, &c__0, &c__0, &s[1], &rwork[ie], &
4170 vt[vt_offset], ldvt, cdum, &c__1, cdum, &c__1,
4171 &rwork[irwork], info);
4177 /* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */
4178 /* N right singular vectors to be computed in VT and */
4179 /* M left singular vectors to be overwritten on A */
4182 i__2 = *n + *m, i__3 = *m * 3;
4183 if (*lwork >= (*m << 1) * *m + f2cmax(i__2,i__3)) {
4185 /* Sufficient workspace for a fast algorithm */
4188 if (*lwork >= wrkbl + (*lda << 1) * *m) {
4190 /* WORK(IU) is LDA by M and WORK(IR) is LDA by M */
4193 ir = iu + ldwrku * *m;
4195 } else if (*lwork >= wrkbl + (*lda + *m) * *m) {
4197 /* WORK(IU) is LDA by M and WORK(IR) is M by M */
4200 ir = iu + ldwrku * *m;
4204 /* WORK(IU) is M by M and WORK(IR) is M by M */
4207 ir = iu + ldwrku * *m;
4210 itau = ir + ldwrkr * *m;
4213 /* Compute A=L*Q, copying result to VT */
4214 /* (CWorkspace: need 2*M*M+2*M, prefer 2*M*M+M+M*NB) */
4215 /* (RWorkspace: 0) */
4217 i__2 = *lwork - iwork + 1;
4218 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
4219 iwork], &i__2, &ierr);
4220 clacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
4223 /* Generate Q in VT */
4224 /* (CWorkspace: need 2*M*M+M+N, prefer 2*M*M+M+N*NB) */
4225 /* (RWorkspace: 0) */
4227 i__2 = *lwork - iwork + 1;
4228 cunglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &
4229 work[iwork], &i__2, &ierr);
4231 /* Copy L to WORK(IU), zeroing out above it */
4233 clacpy_("L", m, m, &a[a_offset], lda, &work[iu], &
4237 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &work[iu +
4244 /* Bidiagonalize L in WORK(IU), copying result to */
4246 /* (CWorkspace: need 2*M*M+3*M, */
4247 /* prefer 2*M*M+2*M+2*M*NB) */
4248 /* (RWorkspace: need M) */
4250 i__2 = *lwork - iwork + 1;
4251 cgebrd_(m, m, &work[iu], &ldwrku, &s[1], &rwork[ie], &
4252 work[itauq], &work[itaup], &work[iwork], &
4254 clacpy_("L", m, m, &work[iu], &ldwrku, &work[ir], &
4257 /* Generate right bidiagonalizing vectors in WORK(IU) */
4258 /* (CWorkspace: need 2*M*M+3*M-1, */
4259 /* prefer 2*M*M+2*M+(M-1)*NB) */
4260 /* (RWorkspace: 0) */
4262 i__2 = *lwork - iwork + 1;
4263 cungbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup]
4264 , &work[iwork], &i__2, &ierr);
4266 /* Generate left bidiagonalizing vectors in WORK(IR) */
4267 /* (CWorkspace: need 2*M*M+3*M, prefer 2*M*M+2*M+M*NB) */
4268 /* (RWorkspace: 0) */
4270 i__2 = *lwork - iwork + 1;
4271 cungbr_("Q", m, m, m, &work[ir], &ldwrkr, &work[itauq]
4272 , &work[iwork], &i__2, &ierr);
4275 /* Perform bidiagonal QR iteration, computing left */
4276 /* singular vectors of L in WORK(IR) and computing */
4277 /* right singular vectors of L in WORK(IU) */
4278 /* (CWorkspace: need 2*M*M) */
4279 /* (RWorkspace: need BDSPAC) */
4281 cbdsqr_("U", m, m, m, &c__0, &s[1], &rwork[ie], &work[
4282 iu], &ldwrku, &work[ir], &ldwrkr, cdum, &c__1,
4283 &rwork[irwork], info);
4285 /* Multiply right singular vectors of L in WORK(IU) by */
4286 /* Q in VT, storing result in A */
4287 /* (CWorkspace: need M*M) */
4288 /* (RWorkspace: 0) */
4290 cgemm_("N", "N", m, n, m, &c_b2, &work[iu], &ldwrku, &
4291 vt[vt_offset], ldvt, &c_b1, &a[a_offset], lda);
4293 /* Copy right singular vectors of A from A to VT */
4295 clacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset],
4298 /* Copy left singular vectors of A from WORK(IR) to A */
4300 clacpy_("F", m, m, &work[ir], &ldwrkr, &a[a_offset],
4305 /* Insufficient workspace for a fast algorithm */
4310 /* Compute A=L*Q, copying result to VT */
4311 /* (CWorkspace: need 2*M, prefer M+M*NB) */
4312 /* (RWorkspace: 0) */
4314 i__2 = *lwork - iwork + 1;
4315 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
4316 iwork], &i__2, &ierr);
4317 clacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
4320 /* Generate Q in VT */
4321 /* (CWorkspace: need M+N, prefer M+N*NB) */
4322 /* (RWorkspace: 0) */
4324 i__2 = *lwork - iwork + 1;
4325 cunglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &
4326 work[iwork], &i__2, &ierr);
4332 /* Zero out above L in A */
4336 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &a[(a_dim1 <<
4339 /* Bidiagonalize L in A */
4340 /* (CWorkspace: need 3*M, prefer 2*M+2*M*NB) */
4341 /* (RWorkspace: need M) */
4343 i__2 = *lwork - iwork + 1;
4344 cgebrd_(m, m, &a[a_offset], lda, &s[1], &rwork[ie], &
4345 work[itauq], &work[itaup], &work[iwork], &
4348 /* Multiply right bidiagonalizing vectors in A by Q */
4350 /* (CWorkspace: need 2*M+N, prefer 2*M+N*NB) */
4351 /* (RWorkspace: 0) */
4353 i__2 = *lwork - iwork + 1;
4354 cunmbr_("P", "L", "C", m, n, m, &a[a_offset], lda, &
4355 work[itaup], &vt[vt_offset], ldvt, &work[
4356 iwork], &i__2, &ierr);
4358 /* Generate left bidiagonalizing vectors in A */
4359 /* (CWorkspace: need 3*M, prefer 2*M+M*NB) */
4360 /* (RWorkspace: 0) */
4362 i__2 = *lwork - iwork + 1;
4363 cungbr_("Q", m, m, m, &a[a_offset], lda, &work[itauq],
4364 &work[iwork], &i__2, &ierr);
4367 /* Perform bidiagonal QR iteration, computing left */
4368 /* singular vectors of A in A and computing right */
4369 /* singular vectors of A in VT */
4370 /* (CWorkspace: 0) */
4371 /* (RWorkspace: need BDSPAC) */
4373 cbdsqr_("U", m, n, m, &c__0, &s[1], &rwork[ie], &vt[
4374 vt_offset], ldvt, &a[a_offset], lda, cdum, &
4375 c__1, &rwork[irwork], info);
4379 } else if (wntuas) {
4381 /* Path 9t(N much larger than M, JOBU='S' or 'A', */
4383 /* N right singular vectors to be computed in VT and */
4384 /* M left singular vectors to be computed in U */
4387 i__2 = *n + *m, i__3 = *m * 3;
4388 if (*lwork >= *m * *m + f2cmax(i__2,i__3)) {
4390 /* Sufficient workspace for a fast algorithm */
4393 if (*lwork >= wrkbl + *lda * *m) {
4395 /* WORK(IU) is LDA by M */
4400 /* WORK(IU) is M by M */
4404 itau = iu + ldwrku * *m;
4407 /* Compute A=L*Q, copying result to VT */
4408 /* (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB) */
4409 /* (RWorkspace: 0) */
4411 i__2 = *lwork - iwork + 1;
4412 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
4413 iwork], &i__2, &ierr);
4414 clacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
4417 /* Generate Q in VT */
4418 /* (CWorkspace: need M*M+M+N, prefer M*M+M+N*NB) */
4419 /* (RWorkspace: 0) */
4421 i__2 = *lwork - iwork + 1;
4422 cunglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &
4423 work[iwork], &i__2, &ierr);
4425 /* Copy L to WORK(IU), zeroing out above it */
4427 clacpy_("L", m, m, &a[a_offset], lda, &work[iu], &
4431 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &work[iu +
4438 /* Bidiagonalize L in WORK(IU), copying result to U */
4439 /* (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB) */
4440 /* (RWorkspace: need M) */
4442 i__2 = *lwork - iwork + 1;
4443 cgebrd_(m, m, &work[iu], &ldwrku, &s[1], &rwork[ie], &
4444 work[itauq], &work[itaup], &work[iwork], &
4446 clacpy_("L", m, m, &work[iu], &ldwrku, &u[u_offset],
4449 /* Generate right bidiagonalizing vectors in WORK(IU) */
4450 /* (CWorkspace: need M*M+3*M, prefer M*M+2*M+(M-1)*NB) */
4451 /* (RWorkspace: 0) */
4453 i__2 = *lwork - iwork + 1;
4454 cungbr_("P", m, m, m, &work[iu], &ldwrku, &work[itaup]
4455 , &work[iwork], &i__2, &ierr);
4457 /* Generate left bidiagonalizing vectors in U */
4458 /* (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB) */
4459 /* (RWorkspace: 0) */
4461 i__2 = *lwork - iwork + 1;
4462 cungbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq],
4463 &work[iwork], &i__2, &ierr);
4466 /* Perform bidiagonal QR iteration, computing left */
4467 /* singular vectors of L in U and computing right */
4468 /* singular vectors of L in WORK(IU) */
4469 /* (CWorkspace: need M*M) */
4470 /* (RWorkspace: need BDSPAC) */
4472 cbdsqr_("U", m, m, m, &c__0, &s[1], &rwork[ie], &work[
4473 iu], &ldwrku, &u[u_offset], ldu, cdum, &c__1,
4474 &rwork[irwork], info);
4476 /* Multiply right singular vectors of L in WORK(IU) by */
4477 /* Q in VT, storing result in A */
4478 /* (CWorkspace: need M*M) */
4479 /* (RWorkspace: 0) */
4481 cgemm_("N", "N", m, n, m, &c_b2, &work[iu], &ldwrku, &
4482 vt[vt_offset], ldvt, &c_b1, &a[a_offset], lda);
4484 /* Copy right singular vectors of A from A to VT */
4486 clacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset],
4491 /* Insufficient workspace for a fast algorithm */
4496 /* Compute A=L*Q, copying result to VT */
4497 /* (CWorkspace: need 2*M, prefer M+M*NB) */
4498 /* (RWorkspace: 0) */
4500 i__2 = *lwork - iwork + 1;
4501 cgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[
4502 iwork], &i__2, &ierr);
4503 clacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset],
4506 /* Generate Q in VT */
4507 /* (CWorkspace: need M+N, prefer M+N*NB) */
4508 /* (RWorkspace: 0) */
4510 i__2 = *lwork - iwork + 1;
4511 cunglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &
4512 work[iwork], &i__2, &ierr);
4514 /* Copy L to U, zeroing out above it */
4516 clacpy_("L", m, m, &a[a_offset], lda, &u[u_offset],
4520 claset_("U", &i__2, &i__3, &c_b1, &c_b1, &u[(u_dim1 <<
4527 /* Bidiagonalize L in U */
4528 /* (CWorkspace: need 3*M, prefer 2*M+2*M*NB) */
4529 /* (RWorkspace: need M) */
4531 i__2 = *lwork - iwork + 1;
4532 cgebrd_(m, m, &u[u_offset], ldu, &s[1], &rwork[ie], &
4533 work[itauq], &work[itaup], &work[iwork], &
4536 /* Multiply right bidiagonalizing vectors in U by Q */
4538 /* (CWorkspace: need 2*M+N, prefer 2*M+N*NB) */
4539 /* (RWorkspace: 0) */
4541 i__2 = *lwork - iwork + 1;
4542 cunmbr_("P", "L", "C", m, n, m, &u[u_offset], ldu, &
4543 work[itaup], &vt[vt_offset], ldvt, &work[
4544 iwork], &i__2, &ierr);
4546 /* Generate left bidiagonalizing vectors in U */
4547 /* (CWorkspace: need 3*M, prefer 2*M+M*NB) */
4548 /* (RWorkspace: 0) */
4550 i__2 = *lwork - iwork + 1;
4551 cungbr_("Q", m, m, m, &u[u_offset], ldu, &work[itauq],
4552 &work[iwork], &i__2, &ierr);
4555 /* Perform bidiagonal QR iteration, computing left */
4556 /* singular vectors of A in U and computing right */
4557 /* singular vectors of A in VT */
4558 /* (CWorkspace: 0) */
4559 /* (RWorkspace: need BDSPAC) */
4561 cbdsqr_("U", m, n, m, &c__0, &s[1], &rwork[ie], &vt[
4562 vt_offset], ldvt, &u[u_offset], ldu, cdum, &
4563 c__1, &rwork[irwork], info);
4575 /* Path 10t(N greater than M, but not much larger) */
4576 /* Reduce to bidiagonal form without LQ decomposition */
4583 /* Bidiagonalize A */
4584 /* (CWorkspace: need 2*M+N, prefer 2*M+(M+N)*NB) */
4585 /* (RWorkspace: M) */
4587 i__2 = *lwork - iwork + 1;
4588 cgebrd_(m, n, &a[a_offset], lda, &s[1], &rwork[ie], &work[itauq],
4589 &work[itaup], &work[iwork], &i__2, &ierr);
4592 /* If left singular vectors desired in U, copy result to U */
4593 /* and generate left bidiagonalizing vectors in U */
4594 /* (CWorkspace: need 3*M-1, prefer 2*M+(M-1)*NB) */
4595 /* (RWorkspace: 0) */
4597 clacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu);
4598 i__2 = *lwork - iwork + 1;
4599 cungbr_("Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[
4600 iwork], &i__2, &ierr);
4604 /* If right singular vectors desired in VT, copy result to */
4605 /* VT and generate right bidiagonalizing vectors in VT */
4606 /* (CWorkspace: need 2*M+NRVT, prefer 2*M+NRVT*NB) */
4607 /* (RWorkspace: 0) */
4609 clacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
4616 i__2 = *lwork - iwork + 1;
4617 cungbr_("P", &nrvt, n, m, &vt[vt_offset], ldvt, &work[itaup],
4618 &work[iwork], &i__2, &ierr);
4622 /* If left singular vectors desired in A, generate left */
4623 /* bidiagonalizing vectors in A */
4624 /* (CWorkspace: need 3*M-1, prefer 2*M+(M-1)*NB) */
4625 /* (RWorkspace: 0) */
4627 i__2 = *lwork - iwork + 1;
4628 cungbr_("Q", m, m, n, &a[a_offset], lda, &work[itauq], &work[
4629 iwork], &i__2, &ierr);
4633 /* If right singular vectors desired in A, generate right */
4634 /* bidiagonalizing vectors in A */
4635 /* (CWorkspace: need 3*M, prefer 2*M+M*NB) */
4636 /* (RWorkspace: 0) */
4638 i__2 = *lwork - iwork + 1;
4639 cungbr_("P", m, n, m, &a[a_offset], lda, &work[itaup], &work[
4640 iwork], &i__2, &ierr);
4643 if (wntuas || wntuo) {
4649 if (wntvas || wntvo) {
4655 if (! wntuo && ! wntvo) {
4657 /* Perform bidiagonal QR iteration, if desired, computing */
4658 /* left singular vectors in U and computing right singular */
4660 /* (CWorkspace: 0) */
4661 /* (RWorkspace: need BDSPAC) */
4663 cbdsqr_("L", m, &ncvt, &nru, &c__0, &s[1], &rwork[ie], &vt[
4664 vt_offset], ldvt, &u[u_offset], ldu, cdum, &c__1, &
4665 rwork[irwork], info);
4666 } else if (! wntuo && wntvo) {
4668 /* Perform bidiagonal QR iteration, if desired, computing */
4669 /* left singular vectors in U and computing right singular */
4671 /* (CWorkspace: 0) */
4672 /* (RWorkspace: need BDSPAC) */
4674 cbdsqr_("L", m, &ncvt, &nru, &c__0, &s[1], &rwork[ie], &a[
4675 a_offset], lda, &u[u_offset], ldu, cdum, &c__1, &
4676 rwork[irwork], info);
4679 /* Perform bidiagonal QR iteration, if desired, computing */
4680 /* left singular vectors in A and computing right singular */
4682 /* (CWorkspace: 0) */
4683 /* (RWorkspace: need BDSPAC) */
4685 cbdsqr_("L", m, &ncvt, &nru, &c__0, &s[1], &rwork[ie], &vt[
4686 vt_offset], ldvt, &a[a_offset], lda, cdum, &c__1, &
4687 rwork[irwork], info);
4694 /* Undo scaling if necessary */
4697 if (anrm > bignum) {
4698 slascl_("G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], &
4701 if (*info != 0 && anrm > bignum) {
4703 slascl_("G", &c__0, &c__0, &bignum, &anrm, &i__2, &c__1, &rwork[
4704 ie], &minmn, &ierr);
4706 if (anrm < smlnum) {
4707 slascl_("G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], &
4710 if (*info != 0 && anrm < smlnum) {
4712 slascl_("G", &c__0, &c__0, &smlnum, &anrm, &i__2, &c__1, &rwork[
4713 ie], &minmn, &ierr);
4717 /* Return optimal workspace in WORK(1) */
4719 work[1].r = (real) maxwrk, work[1].i = 0.f;