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 doublecomplex c_b1 = {0.,0.};
516 static doublecomplex c_b2 = {1.,0.};
517 static integer c_n1 = -1;
518 static integer c__0 = 0;
519 static integer c__1 = 1;
521 /* > \brief \b ZGESDD */
523 /* =========== DOCUMENTATION =========== */
525 /* Online html documentation available at */
526 /* http://www.netlib.org/lapack/explore-html/ */
529 /* > Download ZGESDD + dependencies */
530 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zgesdd.
533 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zgesdd.
536 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zgesdd.
544 /* SUBROUTINE ZGESDD( JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, */
545 /* WORK, LWORK, RWORK, IWORK, INFO ) */
548 /* INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N */
549 /* INTEGER IWORK( * ) */
550 /* DOUBLE PRECISION RWORK( * ), S( * ) */
551 /* COMPLEX*16 A( LDA, * ), U( LDU, * ), VT( LDVT, * ), */
555 /* > \par Purpose: */
560 /* > ZGESDD computes the singular value decomposition (SVD) of a complex */
561 /* > M-by-N matrix A, optionally computing the left and/or right singular */
562 /* > vectors, by using divide-and-conquer method. The SVD is written */
564 /* > A = U * SIGMA * conjugate-transpose(V) */
566 /* > where SIGMA is an M-by-N matrix which is zero except for its */
567 /* > f2cmin(m,n) diagonal elements, U is an M-by-M unitary matrix, and */
568 /* > V is an N-by-N unitary matrix. The diagonal elements of SIGMA */
569 /* > are the singular values of A; they are real and non-negative, and */
570 /* > are returned in descending order. The first f2cmin(m,n) columns of */
571 /* > U and V are the left and right singular vectors of A. */
573 /* > Note that the routine returns VT = V**H, not V. */
575 /* > The divide and conquer algorithm makes very mild assumptions about */
576 /* > floating point arithmetic. It will work on machines with a guard */
577 /* > digit in add/subtract, or on those binary machines without guard */
578 /* > digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */
579 /* > Cray-2. It could conceivably fail on hexadecimal or decimal machines */
580 /* > without guard digits, but we know of none. */
586 /* > \param[in] JOBZ */
588 /* > JOBZ is CHARACTER*1 */
589 /* > Specifies options for computing all or part of the matrix U: */
590 /* > = 'A': all M columns of U and all N rows of V**H are */
591 /* > returned in the arrays U and VT; */
592 /* > = 'S': the first f2cmin(M,N) columns of U and the first */
593 /* > f2cmin(M,N) rows of V**H are returned in the arrays U */
595 /* > = 'O': If M >= N, the first N columns of U are overwritten */
596 /* > in the array A and all rows of V**H are returned in */
597 /* > the array VT; */
598 /* > otherwise, all columns of U are returned in the */
599 /* > array U and the first M rows of V**H are overwritten */
600 /* > in the array A; */
601 /* > = 'N': no columns of U or rows of V**H are computed. */
607 /* > The number of rows of the input matrix A. M >= 0. */
613 /* > The number of columns of the input matrix A. N >= 0. */
616 /* > \param[in,out] A */
618 /* > A is COMPLEX*16 array, dimension (LDA,N) */
619 /* > On entry, the M-by-N matrix A. */
621 /* > if JOBZ = 'O', A is overwritten with the first N columns */
622 /* > of U (the left singular vectors, stored */
623 /* > columnwise) if M >= N; */
624 /* > A is overwritten with the first M rows */
625 /* > of V**H (the right singular vectors, stored */
626 /* > rowwise) otherwise. */
627 /* > if JOBZ .ne. 'O', the contents of A are destroyed. */
630 /* > \param[in] LDA */
632 /* > LDA is INTEGER */
633 /* > The leading dimension of the array A. LDA >= f2cmax(1,M). */
636 /* > \param[out] S */
638 /* > S is DOUBLE PRECISION array, dimension (f2cmin(M,N)) */
639 /* > The singular values of A, sorted so that S(i) >= S(i+1). */
642 /* > \param[out] U */
644 /* > U is COMPLEX*16 array, dimension (LDU,UCOL) */
645 /* > UCOL = M if JOBZ = 'A' or JOBZ = 'O' and M < N; */
646 /* > UCOL = f2cmin(M,N) if JOBZ = 'S'. */
647 /* > If JOBZ = 'A' or JOBZ = 'O' and M < N, U contains the M-by-M */
648 /* > unitary matrix U; */
649 /* > if JOBZ = 'S', U contains the first f2cmin(M,N) columns of U */
650 /* > (the left singular vectors, stored columnwise); */
651 /* > if JOBZ = 'O' and M >= N, or JOBZ = 'N', U is not referenced. */
654 /* > \param[in] LDU */
656 /* > LDU is INTEGER */
657 /* > The leading dimension of the array U. LDU >= 1; */
658 /* > if JOBZ = 'S' or 'A' or JOBZ = 'O' and M < N, LDU >= M. */
661 /* > \param[out] VT */
663 /* > VT is COMPLEX*16 array, dimension (LDVT,N) */
664 /* > If JOBZ = 'A' or JOBZ = 'O' and M >= N, VT contains the */
665 /* > N-by-N unitary matrix V**H; */
666 /* > if JOBZ = 'S', VT contains the first f2cmin(M,N) rows of */
667 /* > V**H (the right singular vectors, stored rowwise); */
668 /* > if JOBZ = 'O' and M < N, or JOBZ = 'N', VT is not referenced. */
671 /* > \param[in] LDVT */
673 /* > LDVT is INTEGER */
674 /* > The leading dimension of the array VT. LDVT >= 1; */
675 /* > if JOBZ = 'A' or JOBZ = 'O' and M >= N, LDVT >= N; */
676 /* > if JOBZ = 'S', LDVT >= f2cmin(M,N). */
679 /* > \param[out] WORK */
681 /* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */
682 /* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */
685 /* > \param[in] LWORK */
687 /* > LWORK is INTEGER */
688 /* > The dimension of the array WORK. LWORK >= 1. */
689 /* > If LWORK = -1, a workspace query is assumed. The optimal */
690 /* > size for the WORK array is calculated and stored in WORK(1), */
691 /* > and no other work except argument checking is performed. */
693 /* > Let mx = f2cmax(M,N) and mn = f2cmin(M,N). */
694 /* > If JOBZ = 'N', LWORK >= 2*mn + mx. */
695 /* > If JOBZ = 'O', LWORK >= 2*mn*mn + 2*mn + mx. */
696 /* > If JOBZ = 'S', LWORK >= mn*mn + 3*mn. */
697 /* > If JOBZ = 'A', LWORK >= mn*mn + 2*mn + mx. */
698 /* > These are not tight minimums in all cases; see comments inside code. */
699 /* > For good performance, LWORK should generally be larger; */
700 /* > a query is recommended. */
703 /* > \param[out] RWORK */
705 /* > RWORK is DOUBLE PRECISION array, dimension (MAX(1,LRWORK)) */
706 /* > Let mx = f2cmax(M,N) and mn = f2cmin(M,N). */
707 /* > If JOBZ = 'N', LRWORK >= 5*mn (LAPACK <= 3.6 needs 7*mn); */
708 /* > else if mx >> mn, LRWORK >= 5*mn*mn + 5*mn; */
709 /* > else LRWORK >= f2cmax( 5*mn*mn + 5*mn, */
710 /* > 2*mx*mn + 2*mn*mn + mn ). */
713 /* > \param[out] IWORK */
715 /* > IWORK is INTEGER array, dimension (8*f2cmin(M,N)) */
718 /* > \param[out] INFO */
720 /* > INFO is INTEGER */
721 /* > = 0: successful exit. */
722 /* > < 0: if INFO = -i, the i-th argument had an illegal value. */
723 /* > > 0: The updating process of DBDSDC did not converge. */
729 /* > \author Univ. of Tennessee */
730 /* > \author Univ. of California Berkeley */
731 /* > \author Univ. of Colorado Denver */
732 /* > \author NAG Ltd. */
734 /* > \date June 2016 */
736 /* > \ingroup complex16GEsing */
738 /* > \par Contributors: */
739 /* ================== */
741 /* > Ming Gu and Huan Ren, Computer Science Division, University of */
742 /* > California at Berkeley, USA */
744 /* ===================================================================== */
745 /* Subroutine */ int zgesdd_(char *jobz, integer *m, integer *n,
746 doublecomplex *a, integer *lda, doublereal *s, doublecomplex *u,
747 integer *ldu, doublecomplex *vt, integer *ldvt, doublecomplex *work,
748 integer *lwork, doublereal *rwork, integer *iwork, integer *info)
750 /* System generated locals */
751 integer a_dim1, a_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1,
754 /* Local variables */
755 integer lwork_zgebrd_mm__, lwork_zgebrd_mn__, lwork_zgebrd_nn__,
756 lwork_zgelqf_mn__, lwork_zgeqrf_mn__;
757 doublecomplex cdum[1];
760 integer idum[1], ierr, itau, lwork_zunglq_mn__, lwork_zunglq_nn__,
761 lwork_zungqr_mm__, lwork_zungqr_mn__, irvt, lwork_zunmbr_prc_mm__,
762 lwork_zunmbr_prc_mn__, lwork_zunmbr_prc_nn__,
763 lwork_zunmbr_qln_mm__, lwork_zunmbr_qln_mn__,
764 lwork_zunmbr_qln_nn__, i__;
765 extern logical lsame_(char *, char *);
766 integer chunk, minmn;
767 extern /* Subroutine */ int zgemm_(char *, char *, integer *, integer *,
768 integer *, doublecomplex *, doublecomplex *, integer *,
769 doublecomplex *, integer *, doublecomplex *, doublecomplex *,
771 integer wrkbl, itaup, itauq;
774 logical wntqn, wntqo, wntqs;
775 extern /* Subroutine */ int zlacp2_(char *, integer *, integer *,
776 doublereal *, integer *, doublecomplex *, integer *);
777 integer mnthr1, mnthr2, ie;
778 extern /* Subroutine */ int dbdsdc_(char *, char *, integer *, doublereal
779 *, doublereal *, doublereal *, integer *, doublereal *, integer *,
780 doublereal *, integer *, doublereal *, integer *, integer *);
782 extern doublereal dlamch_(char *);
784 extern /* Subroutine */ int dlascl_(char *, integer *, integer *,
785 doublereal *, doublereal *, integer *, integer *, doublereal *,
786 integer *, integer *);
787 integer lwork_zungbr_p_mn__, lwork_zungbr_p_nn__, lwork_zungbr_q_mn__,
789 extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen);
791 extern /* Subroutine */ int zgebrd_(integer *, integer *, doublecomplex *,
792 integer *, doublereal *, doublereal *, doublecomplex *,
793 doublecomplex *, doublecomplex *, integer *, integer *);
794 extern logical disnan_(doublereal *);
795 extern doublereal zlange_(char *, integer *, integer *, doublecomplex *,
796 integer *, doublereal *);
797 extern /* Subroutine */ int zgelqf_(integer *, integer *, doublecomplex *,
798 integer *, doublecomplex *, doublecomplex *, integer *, integer *
799 ), zlacrm_(integer *, integer *, doublecomplex *, integer *,
800 doublereal *, integer *, doublecomplex *, integer *, doublereal *)
801 , zlarcm_(integer *, integer *, doublereal *, integer *,
802 doublecomplex *, integer *, doublecomplex *, integer *,
803 doublereal *), zlascl_(char *, integer *, integer *, doublereal *,
804 doublereal *, integer *, integer *, doublecomplex *, integer *,
805 integer *), zgeqrf_(integer *, integer *, doublecomplex *,
806 integer *, doublecomplex *, doublecomplex *, integer *, integer *
809 extern /* Subroutine */ int zlacpy_(char *, integer *, integer *,
810 doublecomplex *, integer *, doublecomplex *, integer *),
811 zlaset_(char *, integer *, integer *, doublecomplex *,
812 doublecomplex *, doublecomplex *, integer *);
813 integer ldwrkr, minwrk, ldwrku, maxwrk;
814 extern /* Subroutine */ int zungbr_(char *, integer *, integer *, integer
815 *, doublecomplex *, integer *, doublecomplex *, doublecomplex *,
816 integer *, integer *);
820 extern /* Subroutine */ int zunmbr_(char *, char *, char *, integer *,
821 integer *, integer *, doublecomplex *, integer *, doublecomplex *,
822 doublecomplex *, integer *, doublecomplex *, integer *, integer *
823 ), zunglq_(integer *, integer *, integer *
824 , doublecomplex *, integer *, doublecomplex *, doublecomplex *,
825 integer *, integer *);
828 extern /* Subroutine */ int zungqr_(integer *, integer *, integer *,
829 doublecomplex *, integer *, doublecomplex *, doublecomplex *,
830 integer *, integer *);
832 doublereal dum[1], eps;
836 /* -- LAPACK driver routine (version 3.7.0) -- */
837 /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */
838 /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
842 /* ===================================================================== */
845 /* Test the input arguments */
847 /* Parameter adjustments */
849 a_offset = 1 + a_dim1 * 1;
853 u_offset = 1 + u_dim1 * 1;
856 vt_offset = 1 + vt_dim1 * 1;
864 minmn = f2cmin(*m,*n);
865 mnthr1 = (integer) (minmn * 17. / 9.);
866 mnthr2 = (integer) (minmn * 5. / 3.);
867 wntqa = lsame_(jobz, "A");
868 wntqs = lsame_(jobz, "S");
869 wntqas = wntqa || wntqs;
870 wntqo = lsame_(jobz, "O");
871 wntqn = lsame_(jobz, "N");
872 lquery = *lwork == -1;
876 if (! (wntqa || wntqs || wntqo || wntqn)) {
882 } else if (*lda < f2cmax(1,*m)) {
884 } else if (*ldu < 1 || wntqas && *ldu < *m || wntqo && *m < *n && *ldu < *
887 } else if (*ldvt < 1 || wntqa && *ldvt < *n || wntqs && *ldvt < minmn ||
888 wntqo && *m >= *n && *ldvt < *n) {
892 /* Compute workspace */
893 /* Note: Comments in the code beginning "Workspace:" describe the */
894 /* minimal amount of workspace allocated at that point in the code, */
895 /* as well as the preferred amount for good performance. */
896 /* CWorkspace refers to complex workspace, and RWorkspace to */
897 /* real workspace. NB refers to the optimal block size for the */
898 /* immediately following subroutine, as returned by ILAENV.) */
903 if (*m >= *n && minmn > 0) {
905 /* There is no complex work space needed for bidiagonal SVD */
906 /* The real work space needed for bidiagonal SVD (dbdsdc) is */
907 /* BDSPAC = 3*N*N + 4*N for singular values and vectors; */
908 /* BDSPAC = 4*N for singular values only; */
909 /* not including e, RU, and RVT matrices. */
911 /* Compute space preferred for each routine */
912 zgebrd_(m, n, cdum, m, dum, dum, cdum, cdum, cdum, &c_n1, &ierr);
913 lwork_zgebrd_mn__ = (integer) cdum[0].r;
915 zgebrd_(n, n, cdum, n, dum, dum, cdum, cdum, cdum, &c_n1, &ierr);
916 lwork_zgebrd_nn__ = (integer) cdum[0].r;
918 zgeqrf_(m, n, cdum, m, cdum, cdum, &c_n1, &ierr);
919 lwork_zgeqrf_mn__ = (integer) cdum[0].r;
921 zungbr_("P", n, n, n, cdum, n, cdum, cdum, &c_n1, &ierr);
922 lwork_zungbr_p_nn__ = (integer) cdum[0].r;
924 zungbr_("Q", m, m, n, cdum, m, cdum, cdum, &c_n1, &ierr);
925 lwork_zungbr_q_mm__ = (integer) cdum[0].r;
927 zungbr_("Q", m, n, n, cdum, m, cdum, cdum, &c_n1, &ierr);
928 lwork_zungbr_q_mn__ = (integer) cdum[0].r;
930 zungqr_(m, m, n, cdum, m, cdum, cdum, &c_n1, &ierr);
931 lwork_zungqr_mm__ = (integer) cdum[0].r;
933 zungqr_(m, n, n, cdum, m, cdum, cdum, &c_n1, &ierr);
934 lwork_zungqr_mn__ = (integer) cdum[0].r;
936 zunmbr_("P", "R", "C", n, n, n, cdum, n, cdum, cdum, n, cdum, &
938 lwork_zunmbr_prc_nn__ = (integer) cdum[0].r;
940 zunmbr_("Q", "L", "N", m, m, n, cdum, m, cdum, cdum, m, cdum, &
942 lwork_zunmbr_qln_mm__ = (integer) cdum[0].r;
944 zunmbr_("Q", "L", "N", m, n, n, cdum, m, cdum, cdum, m, cdum, &
946 lwork_zunmbr_qln_mn__ = (integer) cdum[0].r;
948 zunmbr_("Q", "L", "N", n, n, n, cdum, n, cdum, cdum, n, cdum, &
950 lwork_zunmbr_qln_nn__ = (integer) cdum[0].r;
955 /* Path 1 (M >> N, JOBZ='N') */
957 maxwrk = *n + lwork_zgeqrf_mn__;
959 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zgebrd_nn__;
960 maxwrk = f2cmax(i__1,i__2);
964 /* Path 2 (M >> N, JOBZ='O') */
966 wrkbl = *n + lwork_zgeqrf_mn__;
968 i__1 = wrkbl, i__2 = *n + lwork_zungqr_mn__;
969 wrkbl = f2cmax(i__1,i__2);
971 i__1 = wrkbl, i__2 = (*n << 1) + lwork_zgebrd_nn__;
972 wrkbl = f2cmax(i__1,i__2);
974 i__1 = wrkbl, i__2 = (*n << 1) + lwork_zunmbr_qln_nn__;
975 wrkbl = f2cmax(i__1,i__2);
977 i__1 = wrkbl, i__2 = (*n << 1) + lwork_zunmbr_prc_nn__;
978 wrkbl = f2cmax(i__1,i__2);
979 maxwrk = *m * *n + *n * *n + wrkbl;
980 minwrk = (*n << 1) * *n + *n * 3;
983 /* Path 3 (M >> N, JOBZ='S') */
985 wrkbl = *n + lwork_zgeqrf_mn__;
987 i__1 = wrkbl, i__2 = *n + lwork_zungqr_mn__;
988 wrkbl = f2cmax(i__1,i__2);
990 i__1 = wrkbl, i__2 = (*n << 1) + lwork_zgebrd_nn__;
991 wrkbl = f2cmax(i__1,i__2);
993 i__1 = wrkbl, i__2 = (*n << 1) + lwork_zunmbr_qln_nn__;
994 wrkbl = f2cmax(i__1,i__2);
996 i__1 = wrkbl, i__2 = (*n << 1) + lwork_zunmbr_prc_nn__;
997 wrkbl = f2cmax(i__1,i__2);
998 maxwrk = *n * *n + wrkbl;
999 minwrk = *n * *n + *n * 3;
1002 /* Path 4 (M >> N, JOBZ='A') */
1004 wrkbl = *n + lwork_zgeqrf_mn__;
1006 i__1 = wrkbl, i__2 = *n + lwork_zungqr_mm__;
1007 wrkbl = f2cmax(i__1,i__2);
1009 i__1 = wrkbl, i__2 = (*n << 1) + lwork_zgebrd_nn__;
1010 wrkbl = f2cmax(i__1,i__2);
1012 i__1 = wrkbl, i__2 = (*n << 1) + lwork_zunmbr_qln_nn__;
1013 wrkbl = f2cmax(i__1,i__2);
1015 i__1 = wrkbl, i__2 = (*n << 1) + lwork_zunmbr_prc_nn__;
1016 wrkbl = f2cmax(i__1,i__2);
1017 maxwrk = *n * *n + wrkbl;
1019 i__1 = *n * 3, i__2 = *n + *m;
1020 minwrk = *n * *n + f2cmax(i__1,i__2);
1022 } else if (*m >= mnthr2) {
1024 /* Path 5 (M >> N, but not as much as MNTHR1) */
1026 maxwrk = (*n << 1) + lwork_zgebrd_mn__;
1027 minwrk = (*n << 1) + *m;
1029 /* Path 5o (M >> N, JOBZ='O') */
1031 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zungbr_p_nn__;
1032 maxwrk = f2cmax(i__1,i__2);
1034 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zungbr_q_mn__;
1035 maxwrk = f2cmax(i__1,i__2);
1039 /* Path 5s (M >> N, JOBZ='S') */
1041 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zungbr_p_nn__;
1042 maxwrk = f2cmax(i__1,i__2);
1044 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zungbr_q_mn__;
1045 maxwrk = f2cmax(i__1,i__2);
1047 /* Path 5a (M >> N, JOBZ='A') */
1049 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zungbr_p_nn__;
1050 maxwrk = f2cmax(i__1,i__2);
1052 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zungbr_q_mm__;
1053 maxwrk = f2cmax(i__1,i__2);
1057 /* Path 6 (M >= N, but not much larger) */
1059 maxwrk = (*n << 1) + lwork_zgebrd_mn__;
1060 minwrk = (*n << 1) + *m;
1062 /* Path 6o (M >= N, JOBZ='O') */
1064 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zunmbr_prc_nn__;
1065 maxwrk = f2cmax(i__1,i__2);
1067 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zunmbr_qln_mn__;
1068 maxwrk = f2cmax(i__1,i__2);
1072 /* Path 6s (M >= N, JOBZ='S') */
1074 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zunmbr_qln_mn__;
1075 maxwrk = f2cmax(i__1,i__2);
1077 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zunmbr_prc_nn__;
1078 maxwrk = f2cmax(i__1,i__2);
1080 /* Path 6a (M >= N, JOBZ='A') */
1082 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zunmbr_qln_mm__;
1083 maxwrk = f2cmax(i__1,i__2);
1085 i__1 = maxwrk, i__2 = (*n << 1) + lwork_zunmbr_prc_nn__;
1086 maxwrk = f2cmax(i__1,i__2);
1089 } else if (minmn > 0) {
1091 /* There is no complex work space needed for bidiagonal SVD */
1092 /* The real work space needed for bidiagonal SVD (dbdsdc) is */
1093 /* BDSPAC = 3*M*M + 4*M for singular values and vectors; */
1094 /* BDSPAC = 4*M for singular values only; */
1095 /* not including e, RU, and RVT matrices. */
1097 /* Compute space preferred for each routine */
1098 zgebrd_(m, n, cdum, m, dum, dum, cdum, cdum, cdum, &c_n1, &ierr);
1099 lwork_zgebrd_mn__ = (integer) cdum[0].r;
1101 zgebrd_(m, m, cdum, m, dum, dum, cdum, cdum, cdum, &c_n1, &ierr);
1102 lwork_zgebrd_mm__ = (integer) cdum[0].r;
1104 zgelqf_(m, n, cdum, m, cdum, cdum, &c_n1, &ierr);
1105 lwork_zgelqf_mn__ = (integer) cdum[0].r;
1107 zungbr_("P", m, n, m, cdum, m, cdum, cdum, &c_n1, &ierr);
1108 lwork_zungbr_p_mn__ = (integer) cdum[0].r;
1110 zungbr_("P", n, n, m, cdum, n, cdum, cdum, &c_n1, &ierr);
1111 lwork_zungbr_p_nn__ = (integer) cdum[0].r;
1113 zungbr_("Q", m, m, n, cdum, m, cdum, cdum, &c_n1, &ierr);
1114 lwork_zungbr_q_mm__ = (integer) cdum[0].r;
1116 zunglq_(m, n, m, cdum, m, cdum, cdum, &c_n1, &ierr);
1117 lwork_zunglq_mn__ = (integer) cdum[0].r;
1119 zunglq_(n, n, m, cdum, n, cdum, cdum, &c_n1, &ierr);
1120 lwork_zunglq_nn__ = (integer) cdum[0].r;
1122 zunmbr_("P", "R", "C", m, m, m, cdum, m, cdum, cdum, m, cdum, &
1124 lwork_zunmbr_prc_mm__ = (integer) cdum[0].r;
1126 zunmbr_("P", "R", "C", m, n, m, cdum, m, cdum, cdum, m, cdum, &
1128 lwork_zunmbr_prc_mn__ = (integer) cdum[0].r;
1130 zunmbr_("P", "R", "C", n, n, m, cdum, n, cdum, cdum, n, cdum, &
1132 lwork_zunmbr_prc_nn__ = (integer) cdum[0].r;
1134 zunmbr_("Q", "L", "N", m, m, m, cdum, m, cdum, cdum, m, cdum, &
1136 lwork_zunmbr_qln_mm__ = (integer) cdum[0].r;
1141 /* Path 1t (N >> M, JOBZ='N') */
1143 maxwrk = *m + lwork_zgelqf_mn__;
1145 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zgebrd_mm__;
1146 maxwrk = f2cmax(i__1,i__2);
1150 /* Path 2t (N >> M, JOBZ='O') */
1152 wrkbl = *m + lwork_zgelqf_mn__;
1154 i__1 = wrkbl, i__2 = *m + lwork_zunglq_mn__;
1155 wrkbl = f2cmax(i__1,i__2);
1157 i__1 = wrkbl, i__2 = (*m << 1) + lwork_zgebrd_mm__;
1158 wrkbl = f2cmax(i__1,i__2);
1160 i__1 = wrkbl, i__2 = (*m << 1) + lwork_zunmbr_qln_mm__;
1161 wrkbl = f2cmax(i__1,i__2);
1163 i__1 = wrkbl, i__2 = (*m << 1) + lwork_zunmbr_prc_mm__;
1164 wrkbl = f2cmax(i__1,i__2);
1165 maxwrk = *m * *n + *m * *m + wrkbl;
1166 minwrk = (*m << 1) * *m + *m * 3;
1169 /* Path 3t (N >> M, JOBZ='S') */
1171 wrkbl = *m + lwork_zgelqf_mn__;
1173 i__1 = wrkbl, i__2 = *m + lwork_zunglq_mn__;
1174 wrkbl = f2cmax(i__1,i__2);
1176 i__1 = wrkbl, i__2 = (*m << 1) + lwork_zgebrd_mm__;
1177 wrkbl = f2cmax(i__1,i__2);
1179 i__1 = wrkbl, i__2 = (*m << 1) + lwork_zunmbr_qln_mm__;
1180 wrkbl = f2cmax(i__1,i__2);
1182 i__1 = wrkbl, i__2 = (*m << 1) + lwork_zunmbr_prc_mm__;
1183 wrkbl = f2cmax(i__1,i__2);
1184 maxwrk = *m * *m + wrkbl;
1185 minwrk = *m * *m + *m * 3;
1188 /* Path 4t (N >> M, JOBZ='A') */
1190 wrkbl = *m + lwork_zgelqf_mn__;
1192 i__1 = wrkbl, i__2 = *m + lwork_zunglq_nn__;
1193 wrkbl = f2cmax(i__1,i__2);
1195 i__1 = wrkbl, i__2 = (*m << 1) + lwork_zgebrd_mm__;
1196 wrkbl = f2cmax(i__1,i__2);
1198 i__1 = wrkbl, i__2 = (*m << 1) + lwork_zunmbr_qln_mm__;
1199 wrkbl = f2cmax(i__1,i__2);
1201 i__1 = wrkbl, i__2 = (*m << 1) + lwork_zunmbr_prc_mm__;
1202 wrkbl = f2cmax(i__1,i__2);
1203 maxwrk = *m * *m + wrkbl;
1205 i__1 = *m * 3, i__2 = *m + *n;
1206 minwrk = *m * *m + f2cmax(i__1,i__2);
1208 } else if (*n >= mnthr2) {
1210 /* Path 5t (N >> M, but not as much as MNTHR1) */
1212 maxwrk = (*m << 1) + lwork_zgebrd_mn__;
1213 minwrk = (*m << 1) + *n;
1215 /* Path 5to (N >> M, JOBZ='O') */
1217 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zungbr_q_mm__;
1218 maxwrk = f2cmax(i__1,i__2);
1220 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zungbr_p_mn__;
1221 maxwrk = f2cmax(i__1,i__2);
1225 /* Path 5ts (N >> M, JOBZ='S') */
1227 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zungbr_q_mm__;
1228 maxwrk = f2cmax(i__1,i__2);
1230 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zungbr_p_mn__;
1231 maxwrk = f2cmax(i__1,i__2);
1233 /* Path 5ta (N >> M, JOBZ='A') */
1235 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zungbr_q_mm__;
1236 maxwrk = f2cmax(i__1,i__2);
1238 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zungbr_p_nn__;
1239 maxwrk = f2cmax(i__1,i__2);
1243 /* Path 6t (N > M, but not much larger) */
1245 maxwrk = (*m << 1) + lwork_zgebrd_mn__;
1246 minwrk = (*m << 1) + *n;
1248 /* Path 6to (N > M, JOBZ='O') */
1250 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zunmbr_qln_mm__;
1251 maxwrk = f2cmax(i__1,i__2);
1253 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zunmbr_prc_mn__;
1254 maxwrk = f2cmax(i__1,i__2);
1258 /* Path 6ts (N > M, JOBZ='S') */
1260 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zunmbr_qln_mm__;
1261 maxwrk = f2cmax(i__1,i__2);
1263 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zunmbr_prc_mn__;
1264 maxwrk = f2cmax(i__1,i__2);
1266 /* Path 6ta (N > M, JOBZ='A') */
1268 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zunmbr_qln_mm__;
1269 maxwrk = f2cmax(i__1,i__2);
1271 i__1 = maxwrk, i__2 = (*m << 1) + lwork_zunmbr_prc_nn__;
1272 maxwrk = f2cmax(i__1,i__2);
1276 maxwrk = f2cmax(maxwrk,minwrk);
1279 work[1].r = (doublereal) maxwrk, work[1].i = 0.;
1280 if (*lwork < minwrk && ! lquery) {
1287 xerbla_("ZGESDD", &i__1, (ftnlen)6);
1289 } else if (lquery) {
1293 /* Quick return if possible */
1295 if (*m == 0 || *n == 0) {
1299 /* Get machine constants */
1302 smlnum = sqrt(dlamch_("S")) / eps;
1303 bignum = 1. / smlnum;
1305 /* Scale A if f2cmax element outside range [SMLNUM,BIGNUM] */
1307 anrm = zlange_("M", m, n, &a[a_offset], lda, dum);
1308 if (disnan_(&anrm)) {
1313 if (anrm > 0. && anrm < smlnum) {
1315 zlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, &
1317 } else if (anrm > bignum) {
1319 zlascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, &
1325 /* A has at least as many rows as columns. If A has sufficiently */
1326 /* more rows than columns, first reduce using the QR */
1327 /* decomposition (if sufficient workspace available) */
1333 /* Path 1 (M >> N, JOBZ='N') */
1334 /* No singular vectors to be computed */
1340 /* CWorkspace: need N [tau] + N [work] */
1341 /* CWorkspace: prefer N [tau] + N*NB [work] */
1342 /* RWorkspace: need 0 */
1344 i__1 = *lwork - nwork + 1;
1345 zgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &
1348 /* Zero out below R */
1352 zlaset_("L", &i__1, &i__2, &c_b1, &c_b1, &a[a_dim1 + 2], lda);
1358 /* Bidiagonalize R in A */
1359 /* CWorkspace: need 2*N [tauq, taup] + N [work] */
1360 /* CWorkspace: prefer 2*N [tauq, taup] + 2*N*NB [work] */
1361 /* RWorkspace: need N [e] */
1363 i__1 = *lwork - nwork + 1;
1364 zgebrd_(n, n, &a[a_offset], lda, &s[1], &rwork[ie], &work[
1365 itauq], &work[itaup], &work[nwork], &i__1, &ierr);
1368 /* Perform bidiagonal SVD, compute singular values only */
1369 /* CWorkspace: need 0 */
1370 /* RWorkspace: need N [e] + BDSPAC */
1372 dbdsdc_("U", "N", n, &s[1], &rwork[ie], dum, &c__1, dum, &
1373 c__1, dum, idum, &rwork[nrwork], &iwork[1], info);
1377 /* Path 2 (M >> N, JOBZ='O') */
1378 /* N left singular vectors to be overwritten on A and */
1379 /* N right singular vectors to be computed in VT */
1383 /* WORK(IU) is N by N */
1386 ir = iu + ldwrku * *n;
1387 if (*lwork >= *m * *n + *n * *n + *n * 3) {
1389 /* WORK(IR) is M by N */
1393 ldwrkr = (*lwork - *n * *n - *n * 3) / *n;
1395 itau = ir + ldwrkr * *n;
1399 /* CWorkspace: need N*N [U] + N*N [R] + N [tau] + N [work] */
1400 /* CWorkspace: prefer N*N [U] + N*N [R] + N [tau] + N*NB [work] */
1401 /* RWorkspace: need 0 */
1403 i__1 = *lwork - nwork + 1;
1404 zgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &
1407 /* Copy R to WORK( IR ), zeroing out below it */
1409 zlacpy_("U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr);
1412 zlaset_("L", &i__1, &i__2, &c_b1, &c_b1, &work[ir + 1], &
1415 /* Generate Q in A */
1416 /* CWorkspace: need N*N [U] + N*N [R] + N [tau] + N [work] */
1417 /* CWorkspace: prefer N*N [U] + N*N [R] + N [tau] + N*NB [work] */
1418 /* RWorkspace: need 0 */
1420 i__1 = *lwork - nwork + 1;
1421 zungqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[nwork],
1428 /* Bidiagonalize R in WORK(IR) */
1429 /* CWorkspace: need N*N [U] + N*N [R] + 2*N [tauq, taup] + N [work] */
1430 /* CWorkspace: prefer N*N [U] + N*N [R] + 2*N [tauq, taup] + 2*N*NB [work] */
1431 /* RWorkspace: need N [e] */
1433 i__1 = *lwork - nwork + 1;
1434 zgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &rwork[ie], &work[
1435 itauq], &work[itaup], &work[nwork], &i__1, &ierr);
1437 /* Perform bidiagonal SVD, computing left singular vectors */
1438 /* of R in WORK(IRU) and computing right singular vectors */
1439 /* of R in WORK(IRVT) */
1440 /* CWorkspace: need 0 */
1441 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] + BDSPAC */
1444 irvt = iru + *n * *n;
1445 nrwork = irvt + *n * *n;
1446 dbdsdc_("U", "I", n, &s[1], &rwork[ie], &rwork[iru], n, &
1447 rwork[irvt], n, dum, idum, &rwork[nrwork], &iwork[1],
1450 /* Copy real matrix RWORK(IRU) to complex matrix WORK(IU) */
1451 /* Overwrite WORK(IU) by the left singular vectors of R */
1452 /* CWorkspace: need N*N [U] + N*N [R] + 2*N [tauq, taup] + N [work] */
1453 /* CWorkspace: prefer N*N [U] + N*N [R] + 2*N [tauq, taup] + N*NB [work] */
1454 /* RWorkspace: need 0 */
1456 zlacp2_("F", n, n, &rwork[iru], n, &work[iu], &ldwrku);
1457 i__1 = *lwork - nwork + 1;
1458 zunmbr_("Q", "L", "N", n, n, n, &work[ir], &ldwrkr, &work[
1459 itauq], &work[iu], &ldwrku, &work[nwork], &i__1, &
1462 /* Copy real matrix RWORK(IRVT) to complex matrix VT */
1463 /* Overwrite VT by the right singular vectors of R */
1464 /* CWorkspace: need N*N [U] + N*N [R] + 2*N [tauq, taup] + N [work] */
1465 /* CWorkspace: prefer N*N [U] + N*N [R] + 2*N [tauq, taup] + N*NB [work] */
1466 /* RWorkspace: need 0 */
1468 zlacp2_("F", n, n, &rwork[irvt], n, &vt[vt_offset], ldvt);
1469 i__1 = *lwork - nwork + 1;
1470 zunmbr_("P", "R", "C", n, n, n, &work[ir], &ldwrkr, &work[
1471 itaup], &vt[vt_offset], ldvt, &work[nwork], &i__1, &
1474 /* Multiply Q in A by left singular vectors of R in */
1475 /* WORK(IU), storing result in WORK(IR) and copying to A */
1476 /* CWorkspace: need N*N [U] + N*N [R] */
1477 /* CWorkspace: prefer N*N [U] + M*N [R] */
1478 /* RWorkspace: need 0 */
1482 for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ +=
1485 i__3 = *m - i__ + 1;
1486 chunk = f2cmin(i__3,ldwrkr);
1487 zgemm_("N", "N", &chunk, n, n, &c_b2, &a[i__ + a_dim1],
1488 lda, &work[iu], &ldwrku, &c_b1, &work[ir], &
1490 zlacpy_("F", &chunk, n, &work[ir], &ldwrkr, &a[i__ +
1497 /* Path 3 (M >> N, JOBZ='S') */
1498 /* N left singular vectors to be computed in U and */
1499 /* N right singular vectors to be computed in VT */
1503 /* WORK(IR) is N by N */
1506 itau = ir + ldwrkr * *n;
1510 /* CWorkspace: need N*N [R] + N [tau] + N [work] */
1511 /* CWorkspace: prefer N*N [R] + N [tau] + N*NB [work] */
1512 /* RWorkspace: need 0 */
1514 i__2 = *lwork - nwork + 1;
1515 zgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &
1518 /* Copy R to WORK(IR), zeroing out below it */
1520 zlacpy_("U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr);
1523 zlaset_("L", &i__2, &i__1, &c_b1, &c_b1, &work[ir + 1], &
1526 /* Generate Q in A */
1527 /* CWorkspace: need N*N [R] + N [tau] + N [work] */
1528 /* CWorkspace: prefer N*N [R] + N [tau] + N*NB [work] */
1529 /* RWorkspace: need 0 */
1531 i__2 = *lwork - nwork + 1;
1532 zungqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[nwork],
1539 /* Bidiagonalize R in WORK(IR) */
1540 /* CWorkspace: need N*N [R] + 2*N [tauq, taup] + N [work] */
1541 /* CWorkspace: prefer N*N [R] + 2*N [tauq, taup] + 2*N*NB [work] */
1542 /* RWorkspace: need N [e] */
1544 i__2 = *lwork - nwork + 1;
1545 zgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &rwork[ie], &work[
1546 itauq], &work[itaup], &work[nwork], &i__2, &ierr);
1548 /* Perform bidiagonal SVD, computing left singular vectors */
1549 /* of bidiagonal matrix in RWORK(IRU) and computing right */
1550 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
1551 /* CWorkspace: need 0 */
1552 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] + BDSPAC */
1555 irvt = iru + *n * *n;
1556 nrwork = irvt + *n * *n;
1557 dbdsdc_("U", "I", n, &s[1], &rwork[ie], &rwork[iru], n, &
1558 rwork[irvt], n, dum, idum, &rwork[nrwork], &iwork[1],
1561 /* Copy real matrix RWORK(IRU) to complex matrix U */
1562 /* Overwrite U by left singular vectors of R */
1563 /* CWorkspace: need N*N [R] + 2*N [tauq, taup] + N [work] */
1564 /* CWorkspace: prefer N*N [R] + 2*N [tauq, taup] + N*NB [work] */
1565 /* RWorkspace: need 0 */
1567 zlacp2_("F", n, n, &rwork[iru], n, &u[u_offset], ldu);
1568 i__2 = *lwork - nwork + 1;
1569 zunmbr_("Q", "L", "N", n, n, n, &work[ir], &ldwrkr, &work[
1570 itauq], &u[u_offset], ldu, &work[nwork], &i__2, &ierr);
1572 /* Copy real matrix RWORK(IRVT) to complex matrix VT */
1573 /* Overwrite VT by right singular vectors of R */
1574 /* CWorkspace: need N*N [R] + 2*N [tauq, taup] + N [work] */
1575 /* CWorkspace: prefer N*N [R] + 2*N [tauq, taup] + N*NB [work] */
1576 /* RWorkspace: need 0 */
1578 zlacp2_("F", n, n, &rwork[irvt], n, &vt[vt_offset], ldvt);
1579 i__2 = *lwork - nwork + 1;
1580 zunmbr_("P", "R", "C", n, n, n, &work[ir], &ldwrkr, &work[
1581 itaup], &vt[vt_offset], ldvt, &work[nwork], &i__2, &
1584 /* Multiply Q in A by left singular vectors of R in */
1585 /* WORK(IR), storing result in U */
1586 /* CWorkspace: need N*N [R] */
1587 /* RWorkspace: need 0 */
1589 zlacpy_("F", n, n, &u[u_offset], ldu, &work[ir], &ldwrkr);
1590 zgemm_("N", "N", m, n, n, &c_b2, &a[a_offset], lda, &work[ir],
1591 &ldwrkr, &c_b1, &u[u_offset], ldu);
1595 /* Path 4 (M >> N, JOBZ='A') */
1596 /* M left singular vectors to be computed in U and */
1597 /* N right singular vectors to be computed in VT */
1601 /* WORK(IU) is N by N */
1604 itau = iu + ldwrku * *n;
1607 /* Compute A=Q*R, copying result to U */
1608 /* CWorkspace: need N*N [U] + N [tau] + N [work] */
1609 /* CWorkspace: prefer N*N [U] + N [tau] + N*NB [work] */
1610 /* RWorkspace: need 0 */
1612 i__2 = *lwork - nwork + 1;
1613 zgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &
1615 zlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu);
1617 /* Generate Q in U */
1618 /* CWorkspace: need N*N [U] + N [tau] + M [work] */
1619 /* CWorkspace: prefer N*N [U] + N [tau] + M*NB [work] */
1620 /* RWorkspace: need 0 */
1622 i__2 = *lwork - nwork + 1;
1623 zungqr_(m, m, n, &u[u_offset], ldu, &work[itau], &work[nwork],
1626 /* Produce R in A, zeroing out below it */
1630 zlaset_("L", &i__2, &i__1, &c_b1, &c_b1, &a[a_dim1 + 2], lda);
1636 /* Bidiagonalize R in A */
1637 /* CWorkspace: need N*N [U] + 2*N [tauq, taup] + N [work] */
1638 /* CWorkspace: prefer N*N [U] + 2*N [tauq, taup] + 2*N*NB [work] */
1639 /* RWorkspace: need N [e] */
1641 i__2 = *lwork - nwork + 1;
1642 zgebrd_(n, n, &a[a_offset], lda, &s[1], &rwork[ie], &work[
1643 itauq], &work[itaup], &work[nwork], &i__2, &ierr);
1645 irvt = iru + *n * *n;
1646 nrwork = irvt + *n * *n;
1648 /* Perform bidiagonal SVD, computing left singular vectors */
1649 /* of bidiagonal matrix in RWORK(IRU) and computing right */
1650 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
1651 /* CWorkspace: need 0 */
1652 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] + BDSPAC */
1654 dbdsdc_("U", "I", n, &s[1], &rwork[ie], &rwork[iru], n, &
1655 rwork[irvt], n, dum, idum, &rwork[nrwork], &iwork[1],
1658 /* Copy real matrix RWORK(IRU) to complex matrix WORK(IU) */
1659 /* Overwrite WORK(IU) by left singular vectors of R */
1660 /* CWorkspace: need N*N [U] + 2*N [tauq, taup] + N [work] */
1661 /* CWorkspace: prefer N*N [U] + 2*N [tauq, taup] + N*NB [work] */
1662 /* RWorkspace: need 0 */
1664 zlacp2_("F", n, n, &rwork[iru], n, &work[iu], &ldwrku);
1665 i__2 = *lwork - nwork + 1;
1666 zunmbr_("Q", "L", "N", n, n, n, &a[a_offset], lda, &work[
1667 itauq], &work[iu], &ldwrku, &work[nwork], &i__2, &
1670 /* Copy real matrix RWORK(IRVT) to complex matrix VT */
1671 /* Overwrite VT by right singular vectors of R */
1672 /* CWorkspace: need N*N [U] + 2*N [tauq, taup] + N [work] */
1673 /* CWorkspace: prefer N*N [U] + 2*N [tauq, taup] + N*NB [work] */
1674 /* RWorkspace: need 0 */
1676 zlacp2_("F", n, n, &rwork[irvt], n, &vt[vt_offset], ldvt);
1677 i__2 = *lwork - nwork + 1;
1678 zunmbr_("P", "R", "C", n, n, n, &a[a_offset], lda, &work[
1679 itaup], &vt[vt_offset], ldvt, &work[nwork], &i__2, &
1682 /* Multiply Q in U by left singular vectors of R in */
1683 /* WORK(IU), storing result in A */
1684 /* CWorkspace: need N*N [U] */
1685 /* RWorkspace: need 0 */
1687 zgemm_("N", "N", m, n, n, &c_b2, &u[u_offset], ldu, &work[iu],
1688 &ldwrku, &c_b1, &a[a_offset], lda);
1690 /* Copy left singular vectors of A from A to U */
1692 zlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset], ldu);
1696 } else if (*m >= mnthr2) {
1698 /* MNTHR2 <= M < MNTHR1 */
1700 /* Path 5 (M >> N, but not as much as MNTHR1) */
1701 /* Reduce to bidiagonal form without QR decomposition, use */
1702 /* ZUNGBR and matrix multiplication to compute singular vectors */
1710 /* Bidiagonalize A */
1711 /* CWorkspace: need 2*N [tauq, taup] + M [work] */
1712 /* CWorkspace: prefer 2*N [tauq, taup] + (M+N)*NB [work] */
1713 /* RWorkspace: need N [e] */
1715 i__2 = *lwork - nwork + 1;
1716 zgebrd_(m, n, &a[a_offset], lda, &s[1], &rwork[ie], &work[itauq],
1717 &work[itaup], &work[nwork], &i__2, &ierr);
1720 /* Path 5n (M >> N, JOBZ='N') */
1721 /* Compute singular values only */
1722 /* CWorkspace: need 0 */
1723 /* RWorkspace: need N [e] + BDSPAC */
1725 dbdsdc_("U", "N", n, &s[1], &rwork[ie], dum, &c__1, dum, &
1726 c__1, dum, idum, &rwork[nrwork], &iwork[1], info);
1730 irvt = iru + *n * *n;
1731 nrwork = irvt + *n * *n;
1733 /* Path 5o (M >> N, JOBZ='O') */
1734 /* Copy A to VT, generate P**H */
1735 /* CWorkspace: need 2*N [tauq, taup] + N [work] */
1736 /* CWorkspace: prefer 2*N [tauq, taup] + N*NB [work] */
1737 /* RWorkspace: need 0 */
1739 zlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
1740 i__2 = *lwork - nwork + 1;
1741 zungbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &
1742 work[nwork], &i__2, &ierr);
1744 /* Generate Q in A */
1745 /* CWorkspace: need 2*N [tauq, taup] + N [work] */
1746 /* CWorkspace: prefer 2*N [tauq, taup] + N*NB [work] */
1747 /* RWorkspace: need 0 */
1749 i__2 = *lwork - nwork + 1;
1750 zungbr_("Q", m, n, n, &a[a_offset], lda, &work[itauq], &work[
1751 nwork], &i__2, &ierr);
1753 if (*lwork >= *m * *n + *n * 3) {
1755 /* WORK( IU ) is M by N */
1760 /* WORK(IU) is LDWRKU by N */
1762 ldwrku = (*lwork - *n * 3) / *n;
1764 nwork = iu + ldwrku * *n;
1766 /* Perform bidiagonal SVD, computing left singular vectors */
1767 /* of bidiagonal matrix in RWORK(IRU) and computing right */
1768 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
1769 /* CWorkspace: need 0 */
1770 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] + BDSPAC */
1772 dbdsdc_("U", "I", n, &s[1], &rwork[ie], &rwork[iru], n, &
1773 rwork[irvt], n, dum, idum, &rwork[nrwork], &iwork[1],
1776 /* Multiply real matrix RWORK(IRVT) by P**H in VT, */
1777 /* storing the result in WORK(IU), copying to VT */
1778 /* CWorkspace: need 2*N [tauq, taup] + N*N [U] */
1779 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] + 2*N*N [rwork] */
1781 zlarcm_(n, n, &rwork[irvt], n, &vt[vt_offset], ldvt, &work[iu]
1782 , &ldwrku, &rwork[nrwork]);
1783 zlacpy_("F", n, n, &work[iu], &ldwrku, &vt[vt_offset], ldvt);
1785 /* Multiply Q in A by real matrix RWORK(IRU), storing the */
1786 /* result in WORK(IU), copying to A */
1787 /* CWorkspace: need 2*N [tauq, taup] + N*N [U] */
1788 /* CWorkspace: prefer 2*N [tauq, taup] + M*N [U] */
1789 /* RWorkspace: need N [e] + N*N [RU] + 2*N*N [rwork] */
1790 /* RWorkspace: prefer N [e] + N*N [RU] + 2*M*N [rwork] < N + 5*N*N since M < 2*N here */
1795 for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ +=
1798 i__3 = *m - i__ + 1;
1799 chunk = f2cmin(i__3,ldwrku);
1800 zlacrm_(&chunk, n, &a[i__ + a_dim1], lda, &rwork[iru], n,
1801 &work[iu], &ldwrku, &rwork[nrwork]);
1802 zlacpy_("F", &chunk, n, &work[iu], &ldwrku, &a[i__ +
1809 /* Path 5s (M >> N, JOBZ='S') */
1810 /* Copy A to VT, generate P**H */
1811 /* CWorkspace: need 2*N [tauq, taup] + N [work] */
1812 /* CWorkspace: prefer 2*N [tauq, taup] + N*NB [work] */
1813 /* RWorkspace: need 0 */
1815 zlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
1816 i__1 = *lwork - nwork + 1;
1817 zungbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &
1818 work[nwork], &i__1, &ierr);
1820 /* Copy A to U, generate Q */
1821 /* CWorkspace: need 2*N [tauq, taup] + N [work] */
1822 /* CWorkspace: prefer 2*N [tauq, taup] + N*NB [work] */
1823 /* RWorkspace: need 0 */
1825 zlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu);
1826 i__1 = *lwork - nwork + 1;
1827 zungbr_("Q", m, n, n, &u[u_offset], ldu, &work[itauq], &work[
1828 nwork], &i__1, &ierr);
1830 /* Perform bidiagonal SVD, computing left singular vectors */
1831 /* of bidiagonal matrix in RWORK(IRU) and computing right */
1832 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
1833 /* CWorkspace: need 0 */
1834 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] + BDSPAC */
1837 irvt = iru + *n * *n;
1838 nrwork = irvt + *n * *n;
1839 dbdsdc_("U", "I", n, &s[1], &rwork[ie], &rwork[iru], n, &
1840 rwork[irvt], n, dum, idum, &rwork[nrwork], &iwork[1],
1843 /* Multiply real matrix RWORK(IRVT) by P**H in VT, */
1844 /* storing the result in A, copying to VT */
1845 /* CWorkspace: need 0 */
1846 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] + 2*N*N [rwork] */
1848 zlarcm_(n, n, &rwork[irvt], n, &vt[vt_offset], ldvt, &a[
1849 a_offset], lda, &rwork[nrwork]);
1850 zlacpy_("F", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
1852 /* Multiply Q in U by real matrix RWORK(IRU), storing the */
1853 /* result in A, copying to U */
1854 /* CWorkspace: need 0 */
1855 /* RWorkspace: need N [e] + N*N [RU] + 2*M*N [rwork] < N + 5*N*N since M < 2*N here */
1858 zlacrm_(m, n, &u[u_offset], ldu, &rwork[iru], n, &a[a_offset],
1859 lda, &rwork[nrwork]);
1860 zlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset], ldu);
1863 /* Path 5a (M >> N, JOBZ='A') */
1864 /* Copy A to VT, generate P**H */
1865 /* CWorkspace: need 2*N [tauq, taup] + N [work] */
1866 /* CWorkspace: prefer 2*N [tauq, taup] + N*NB [work] */
1867 /* RWorkspace: need 0 */
1869 zlacpy_("U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
1870 i__1 = *lwork - nwork + 1;
1871 zungbr_("P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &
1872 work[nwork], &i__1, &ierr);
1874 /* Copy A to U, generate Q */
1875 /* CWorkspace: need 2*N [tauq, taup] + M [work] */
1876 /* CWorkspace: prefer 2*N [tauq, taup] + M*NB [work] */
1877 /* RWorkspace: need 0 */
1879 zlacpy_("L", m, n, &a[a_offset], lda, &u[u_offset], ldu);
1880 i__1 = *lwork - nwork + 1;
1881 zungbr_("Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[
1882 nwork], &i__1, &ierr);
1884 /* Perform bidiagonal SVD, computing left singular vectors */
1885 /* of bidiagonal matrix in RWORK(IRU) and computing right */
1886 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
1887 /* CWorkspace: need 0 */
1888 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] + BDSPAC */
1891 irvt = iru + *n * *n;
1892 nrwork = irvt + *n * *n;
1893 dbdsdc_("U", "I", n, &s[1], &rwork[ie], &rwork[iru], n, &
1894 rwork[irvt], n, dum, idum, &rwork[nrwork], &iwork[1],
1897 /* Multiply real matrix RWORK(IRVT) by P**H in VT, */
1898 /* storing the result in A, copying to VT */
1899 /* CWorkspace: need 0 */
1900 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] + 2*N*N [rwork] */
1902 zlarcm_(n, n, &rwork[irvt], n, &vt[vt_offset], ldvt, &a[
1903 a_offset], lda, &rwork[nrwork]);
1904 zlacpy_("F", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
1906 /* Multiply Q in U by real matrix RWORK(IRU), storing the */
1907 /* result in A, copying to U */
1908 /* CWorkspace: need 0 */
1909 /* RWorkspace: need N [e] + N*N [RU] + 2*M*N [rwork] < N + 5*N*N since M < 2*N here */
1912 zlacrm_(m, n, &u[u_offset], ldu, &rwork[iru], n, &a[a_offset],
1913 lda, &rwork[nrwork]);
1914 zlacpy_("F", m, n, &a[a_offset], lda, &u[u_offset], ldu);
1921 /* Path 6 (M >= N, but not much larger) */
1922 /* Reduce to bidiagonal form without QR decomposition */
1923 /* Use ZUNMBR to compute singular vectors */
1931 /* Bidiagonalize A */
1932 /* CWorkspace: need 2*N [tauq, taup] + M [work] */
1933 /* CWorkspace: prefer 2*N [tauq, taup] + (M+N)*NB [work] */
1934 /* RWorkspace: need N [e] */
1936 i__1 = *lwork - nwork + 1;
1937 zgebrd_(m, n, &a[a_offset], lda, &s[1], &rwork[ie], &work[itauq],
1938 &work[itaup], &work[nwork], &i__1, &ierr);
1941 /* Path 6n (M >= N, JOBZ='N') */
1942 /* Compute singular values only */
1943 /* CWorkspace: need 0 */
1944 /* RWorkspace: need N [e] + BDSPAC */
1946 dbdsdc_("U", "N", n, &s[1], &rwork[ie], dum, &c__1, dum, &
1947 c__1, dum, idum, &rwork[nrwork], &iwork[1], info);
1951 irvt = iru + *n * *n;
1952 nrwork = irvt + *n * *n;
1953 if (*lwork >= *m * *n + *n * 3) {
1955 /* WORK( IU ) is M by N */
1960 /* WORK( IU ) is LDWRKU by N */
1962 ldwrku = (*lwork - *n * 3) / *n;
1964 nwork = iu + ldwrku * *n;
1966 /* Path 6o (M >= N, JOBZ='O') */
1967 /* Perform bidiagonal SVD, computing left singular vectors */
1968 /* of bidiagonal matrix in RWORK(IRU) and computing right */
1969 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
1970 /* CWorkspace: need 0 */
1971 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] + BDSPAC */
1973 dbdsdc_("U", "I", n, &s[1], &rwork[ie], &rwork[iru], n, &
1974 rwork[irvt], n, dum, idum, &rwork[nrwork], &iwork[1],
1977 /* Copy real matrix RWORK(IRVT) to complex matrix VT */
1978 /* Overwrite VT by right singular vectors of A */
1979 /* CWorkspace: need 2*N [tauq, taup] + N*N [U] + N [work] */
1980 /* CWorkspace: prefer 2*N [tauq, taup] + N*N [U] + N*NB [work] */
1981 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] */
1983 zlacp2_("F", n, n, &rwork[irvt], n, &vt[vt_offset], ldvt);
1984 i__1 = *lwork - nwork + 1;
1985 zunmbr_("P", "R", "C", n, n, n, &a[a_offset], lda, &work[
1986 itaup], &vt[vt_offset], ldvt, &work[nwork], &i__1, &
1989 if (*lwork >= *m * *n + *n * 3) {
1992 /* Copy real matrix RWORK(IRU) to complex matrix WORK(IU) */
1993 /* Overwrite WORK(IU) by left singular vectors of A, copying */
1995 /* CWorkspace: need 2*N [tauq, taup] + M*N [U] + N [work] */
1996 /* CWorkspace: prefer 2*N [tauq, taup] + M*N [U] + N*NB [work] */
1997 /* RWorkspace: need N [e] + N*N [RU] */
1999 zlaset_("F", m, n, &c_b1, &c_b1, &work[iu], &ldwrku);
2000 zlacp2_("F", n, n, &rwork[iru], n, &work[iu], &ldwrku);
2001 i__1 = *lwork - nwork + 1;
2002 zunmbr_("Q", "L", "N", m, n, n, &a[a_offset], lda, &work[
2003 itauq], &work[iu], &ldwrku, &work[nwork], &i__1, &
2005 zlacpy_("F", m, n, &work[iu], &ldwrku, &a[a_offset], lda);
2009 /* Generate Q in A */
2010 /* CWorkspace: need 2*N [tauq, taup] + N*N [U] + N [work] */
2011 /* CWorkspace: prefer 2*N [tauq, taup] + N*N [U] + N*NB [work] */
2012 /* RWorkspace: need 0 */
2014 i__1 = *lwork - nwork + 1;
2015 zungbr_("Q", m, n, n, &a[a_offset], lda, &work[itauq], &
2016 work[nwork], &i__1, &ierr);
2018 /* Multiply Q in A by real matrix RWORK(IRU), storing the */
2019 /* result in WORK(IU), copying to A */
2020 /* CWorkspace: need 2*N [tauq, taup] + N*N [U] */
2021 /* CWorkspace: prefer 2*N [tauq, taup] + M*N [U] */
2022 /* RWorkspace: need N [e] + N*N [RU] + 2*N*N [rwork] */
2023 /* RWorkspace: prefer N [e] + N*N [RU] + 2*M*N [rwork] < N + 5*N*N since M < 2*N here */
2028 for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ +=
2031 i__3 = *m - i__ + 1;
2032 chunk = f2cmin(i__3,ldwrku);
2033 zlacrm_(&chunk, n, &a[i__ + a_dim1], lda, &rwork[iru],
2034 n, &work[iu], &ldwrku, &rwork[nrwork]);
2035 zlacpy_("F", &chunk, n, &work[iu], &ldwrku, &a[i__ +
2043 /* Path 6s (M >= N, JOBZ='S') */
2044 /* Perform bidiagonal SVD, computing left singular vectors */
2045 /* of bidiagonal matrix in RWORK(IRU) and computing right */
2046 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
2047 /* CWorkspace: need 0 */
2048 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] + BDSPAC */
2051 irvt = iru + *n * *n;
2052 nrwork = irvt + *n * *n;
2053 dbdsdc_("U", "I", n, &s[1], &rwork[ie], &rwork[iru], n, &
2054 rwork[irvt], n, dum, idum, &rwork[nrwork], &iwork[1],
2057 /* Copy real matrix RWORK(IRU) to complex matrix U */
2058 /* Overwrite U by left singular vectors of A */
2059 /* CWorkspace: need 2*N [tauq, taup] + N [work] */
2060 /* CWorkspace: prefer 2*N [tauq, taup] + N*NB [work] */
2061 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] */
2063 zlaset_("F", m, n, &c_b1, &c_b1, &u[u_offset], ldu)
2065 zlacp2_("F", n, n, &rwork[iru], n, &u[u_offset], ldu);
2066 i__2 = *lwork - nwork + 1;
2067 zunmbr_("Q", "L", "N", m, n, n, &a[a_offset], lda, &work[
2068 itauq], &u[u_offset], ldu, &work[nwork], &i__2, &ierr);
2070 /* Copy real matrix RWORK(IRVT) to complex matrix VT */
2071 /* Overwrite VT by right singular vectors of A */
2072 /* CWorkspace: need 2*N [tauq, taup] + N [work] */
2073 /* CWorkspace: prefer 2*N [tauq, taup] + N*NB [work] */
2074 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] */
2076 zlacp2_("F", n, n, &rwork[irvt], n, &vt[vt_offset], ldvt);
2077 i__2 = *lwork - nwork + 1;
2078 zunmbr_("P", "R", "C", n, n, n, &a[a_offset], lda, &work[
2079 itaup], &vt[vt_offset], ldvt, &work[nwork], &i__2, &
2083 /* Path 6a (M >= N, JOBZ='A') */
2084 /* Perform bidiagonal SVD, computing left singular vectors */
2085 /* of bidiagonal matrix in RWORK(IRU) and computing right */
2086 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
2087 /* CWorkspace: need 0 */
2088 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] + BDSPAC */
2091 irvt = iru + *n * *n;
2092 nrwork = irvt + *n * *n;
2093 dbdsdc_("U", "I", n, &s[1], &rwork[ie], &rwork[iru], n, &
2094 rwork[irvt], n, dum, idum, &rwork[nrwork], &iwork[1],
2097 /* Set the right corner of U to identity matrix */
2099 zlaset_("F", m, m, &c_b1, &c_b1, &u[u_offset], ldu)
2104 zlaset_("F", &i__2, &i__1, &c_b1, &c_b2, &u[*n + 1 + (*n
2105 + 1) * u_dim1], ldu);
2108 /* Copy real matrix RWORK(IRU) to complex matrix U */
2109 /* Overwrite U by left singular vectors of A */
2110 /* CWorkspace: need 2*N [tauq, taup] + M [work] */
2111 /* CWorkspace: prefer 2*N [tauq, taup] + M*NB [work] */
2112 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] */
2114 zlacp2_("F", n, n, &rwork[iru], n, &u[u_offset], ldu);
2115 i__2 = *lwork - nwork + 1;
2116 zunmbr_("Q", "L", "N", m, m, n, &a[a_offset], lda, &work[
2117 itauq], &u[u_offset], ldu, &work[nwork], &i__2, &ierr);
2119 /* Copy real matrix RWORK(IRVT) to complex matrix VT */
2120 /* Overwrite VT by right singular vectors of A */
2121 /* CWorkspace: need 2*N [tauq, taup] + N [work] */
2122 /* CWorkspace: prefer 2*N [tauq, taup] + N*NB [work] */
2123 /* RWorkspace: need N [e] + N*N [RU] + N*N [RVT] */
2125 zlacp2_("F", n, n, &rwork[irvt], n, &vt[vt_offset], ldvt);
2126 i__2 = *lwork - nwork + 1;
2127 zunmbr_("P", "R", "C", n, n, n, &a[a_offset], lda, &work[
2128 itaup], &vt[vt_offset], ldvt, &work[nwork], &i__2, &
2136 /* A has more columns than rows. If A has sufficiently more */
2137 /* columns than rows, first reduce using the LQ decomposition (if */
2138 /* sufficient workspace available) */
2144 /* Path 1t (N >> M, JOBZ='N') */
2145 /* No singular vectors to be computed */
2151 /* CWorkspace: need M [tau] + M [work] */
2152 /* CWorkspace: prefer M [tau] + M*NB [work] */
2153 /* RWorkspace: need 0 */
2155 i__2 = *lwork - nwork + 1;
2156 zgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &
2159 /* Zero out above L */
2163 zlaset_("U", &i__2, &i__1, &c_b1, &c_b1, &a[(a_dim1 << 1) + 1]
2170 /* Bidiagonalize L in A */
2171 /* CWorkspace: need 2*M [tauq, taup] + M [work] */
2172 /* CWorkspace: prefer 2*M [tauq, taup] + 2*M*NB [work] */
2173 /* RWorkspace: need M [e] */
2175 i__2 = *lwork - nwork + 1;
2176 zgebrd_(m, m, &a[a_offset], lda, &s[1], &rwork[ie], &work[
2177 itauq], &work[itaup], &work[nwork], &i__2, &ierr);
2180 /* Perform bidiagonal SVD, compute singular values only */
2181 /* CWorkspace: need 0 */
2182 /* RWorkspace: need M [e] + BDSPAC */
2184 dbdsdc_("U", "N", m, &s[1], &rwork[ie], dum, &c__1, dum, &
2185 c__1, dum, idum, &rwork[nrwork], &iwork[1], info);
2189 /* Path 2t (N >> M, JOBZ='O') */
2190 /* M right singular vectors to be overwritten on A and */
2191 /* M left singular vectors to be computed in U */
2196 /* WORK(IVT) is M by M */
2198 il = ivt + ldwkvt * *m;
2199 if (*lwork >= *m * *n + *m * *m + *m * 3) {
2201 /* WORK(IL) M by N */
2207 /* WORK(IL) is M by CHUNK */
2210 chunk = (*lwork - *m * *m - *m * 3) / *m;
2212 itau = il + ldwrkl * chunk;
2216 /* CWorkspace: need M*M [VT] + M*M [L] + M [tau] + M [work] */
2217 /* CWorkspace: prefer M*M [VT] + M*M [L] + M [tau] + M*NB [work] */
2218 /* RWorkspace: need 0 */
2220 i__2 = *lwork - nwork + 1;
2221 zgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &
2224 /* Copy L to WORK(IL), zeroing about above it */
2226 zlacpy_("L", m, m, &a[a_offset], lda, &work[il], &ldwrkl);
2229 zlaset_("U", &i__2, &i__1, &c_b1, &c_b1, &work[il + ldwrkl], &
2232 /* Generate Q in A */
2233 /* CWorkspace: need M*M [VT] + M*M [L] + M [tau] + M [work] */
2234 /* CWorkspace: prefer M*M [VT] + M*M [L] + M [tau] + M*NB [work] */
2235 /* RWorkspace: need 0 */
2237 i__2 = *lwork - nwork + 1;
2238 zunglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[nwork],
2245 /* Bidiagonalize L in WORK(IL) */
2246 /* CWorkspace: need M*M [VT] + M*M [L] + 2*M [tauq, taup] + M [work] */
2247 /* CWorkspace: prefer M*M [VT] + M*M [L] + 2*M [tauq, taup] + 2*M*NB [work] */
2248 /* RWorkspace: need M [e] */
2250 i__2 = *lwork - nwork + 1;
2251 zgebrd_(m, m, &work[il], &ldwrkl, &s[1], &rwork[ie], &work[
2252 itauq], &work[itaup], &work[nwork], &i__2, &ierr);
2254 /* Perform bidiagonal SVD, computing left singular vectors */
2255 /* of bidiagonal matrix in RWORK(IRU) and computing right */
2256 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
2257 /* CWorkspace: need 0 */
2258 /* RWorkspace: need M [e] + M*M [RU] + M*M [RVT] + BDSPAC */
2261 irvt = iru + *m * *m;
2262 nrwork = irvt + *m * *m;
2263 dbdsdc_("U", "I", m, &s[1], &rwork[ie], &rwork[iru], m, &
2264 rwork[irvt], m, dum, idum, &rwork[nrwork], &iwork[1],
2267 /* Copy real matrix RWORK(IRU) to complex matrix WORK(IU) */
2268 /* Overwrite WORK(IU) by the left singular vectors of L */
2269 /* CWorkspace: need M*M [VT] + M*M [L] + 2*M [tauq, taup] + M [work] */
2270 /* CWorkspace: prefer M*M [VT] + M*M [L] + 2*M [tauq, taup] + M*NB [work] */
2271 /* RWorkspace: need 0 */
2273 zlacp2_("F", m, m, &rwork[iru], m, &u[u_offset], ldu);
2274 i__2 = *lwork - nwork + 1;
2275 zunmbr_("Q", "L", "N", m, m, m, &work[il], &ldwrkl, &work[
2276 itauq], &u[u_offset], ldu, &work[nwork], &i__2, &ierr);
2278 /* Copy real matrix RWORK(IRVT) to complex matrix WORK(IVT) */
2279 /* Overwrite WORK(IVT) by the right singular vectors of L */
2280 /* CWorkspace: need M*M [VT] + M*M [L] + 2*M [tauq, taup] + M [work] */
2281 /* CWorkspace: prefer M*M [VT] + M*M [L] + 2*M [tauq, taup] + M*NB [work] */
2282 /* RWorkspace: need 0 */
2284 zlacp2_("F", m, m, &rwork[irvt], m, &work[ivt], &ldwkvt);
2285 i__2 = *lwork - nwork + 1;
2286 zunmbr_("P", "R", "C", m, m, m, &work[il], &ldwrkl, &work[
2287 itaup], &work[ivt], &ldwkvt, &work[nwork], &i__2, &
2290 /* Multiply right singular vectors of L in WORK(IL) by Q */
2291 /* in A, storing result in WORK(IL) and copying to A */
2292 /* CWorkspace: need M*M [VT] + M*M [L] */
2293 /* CWorkspace: prefer M*M [VT] + M*N [L] */
2294 /* RWorkspace: need 0 */
2298 for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ +=
2301 i__3 = *n - i__ + 1;
2302 blk = f2cmin(i__3,chunk);
2303 zgemm_("N", "N", m, &blk, m, &c_b2, &work[ivt], m, &a[i__
2304 * a_dim1 + 1], lda, &c_b1, &work[il], &ldwrkl);
2305 zlacpy_("F", m, &blk, &work[il], &ldwrkl, &a[i__ * a_dim1
2312 /* Path 3t (N >> M, JOBZ='S') */
2313 /* M right singular vectors to be computed in VT and */
2314 /* M left singular vectors to be computed in U */
2318 /* WORK(IL) is M by M */
2321 itau = il + ldwrkl * *m;
2325 /* CWorkspace: need M*M [L] + M [tau] + M [work] */
2326 /* CWorkspace: prefer M*M [L] + M [tau] + M*NB [work] */
2327 /* RWorkspace: need 0 */
2329 i__1 = *lwork - nwork + 1;
2330 zgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &
2333 /* Copy L to WORK(IL), zeroing out above it */
2335 zlacpy_("L", m, m, &a[a_offset], lda, &work[il], &ldwrkl);
2338 zlaset_("U", &i__1, &i__2, &c_b1, &c_b1, &work[il + ldwrkl], &
2341 /* Generate Q in A */
2342 /* CWorkspace: need M*M [L] + M [tau] + M [work] */
2343 /* CWorkspace: prefer M*M [L] + M [tau] + M*NB [work] */
2344 /* RWorkspace: need 0 */
2346 i__1 = *lwork - nwork + 1;
2347 zunglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[nwork],
2354 /* Bidiagonalize L in WORK(IL) */
2355 /* CWorkspace: need M*M [L] + 2*M [tauq, taup] + M [work] */
2356 /* CWorkspace: prefer M*M [L] + 2*M [tauq, taup] + 2*M*NB [work] */
2357 /* RWorkspace: need M [e] */
2359 i__1 = *lwork - nwork + 1;
2360 zgebrd_(m, m, &work[il], &ldwrkl, &s[1], &rwork[ie], &work[
2361 itauq], &work[itaup], &work[nwork], &i__1, &ierr);
2363 /* Perform bidiagonal SVD, computing left singular vectors */
2364 /* of bidiagonal matrix in RWORK(IRU) and computing right */
2365 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
2366 /* CWorkspace: need 0 */
2367 /* RWorkspace: need M [e] + M*M [RU] + M*M [RVT] + BDSPAC */
2370 irvt = iru + *m * *m;
2371 nrwork = irvt + *m * *m;
2372 dbdsdc_("U", "I", m, &s[1], &rwork[ie], &rwork[iru], m, &
2373 rwork[irvt], m, dum, idum, &rwork[nrwork], &iwork[1],
2376 /* Copy real matrix RWORK(IRU) to complex matrix U */
2377 /* Overwrite U by left singular vectors of L */
2378 /* CWorkspace: need M*M [L] + 2*M [tauq, taup] + M [work] */
2379 /* CWorkspace: prefer M*M [L] + 2*M [tauq, taup] + M*NB [work] */
2380 /* RWorkspace: need 0 */
2382 zlacp2_("F", m, m, &rwork[iru], m, &u[u_offset], ldu);
2383 i__1 = *lwork - nwork + 1;
2384 zunmbr_("Q", "L", "N", m, m, m, &work[il], &ldwrkl, &work[
2385 itauq], &u[u_offset], ldu, &work[nwork], &i__1, &ierr);
2387 /* Copy real matrix RWORK(IRVT) to complex matrix VT */
2388 /* Overwrite VT by left singular vectors of L */
2389 /* CWorkspace: need M*M [L] + 2*M [tauq, taup] + M [work] */
2390 /* CWorkspace: prefer M*M [L] + 2*M [tauq, taup] + M*NB [work] */
2391 /* RWorkspace: need 0 */
2393 zlacp2_("F", m, m, &rwork[irvt], m, &vt[vt_offset], ldvt);
2394 i__1 = *lwork - nwork + 1;
2395 zunmbr_("P", "R", "C", m, m, m, &work[il], &ldwrkl, &work[
2396 itaup], &vt[vt_offset], ldvt, &work[nwork], &i__1, &
2399 /* Copy VT to WORK(IL), multiply right singular vectors of L */
2400 /* in WORK(IL) by Q in A, storing result in VT */
2401 /* CWorkspace: need M*M [L] */
2402 /* RWorkspace: need 0 */
2404 zlacpy_("F", m, m, &vt[vt_offset], ldvt, &work[il], &ldwrkl);
2405 zgemm_("N", "N", m, n, m, &c_b2, &work[il], &ldwrkl, &a[
2406 a_offset], lda, &c_b1, &vt[vt_offset], ldvt);
2410 /* Path 4t (N >> M, JOBZ='A') */
2411 /* N right singular vectors to be computed in VT and */
2412 /* M left singular vectors to be computed in U */
2416 /* WORK(IVT) is M by M */
2419 itau = ivt + ldwkvt * *m;
2422 /* Compute A=L*Q, copying result to VT */
2423 /* CWorkspace: need M*M [VT] + M [tau] + M [work] */
2424 /* CWorkspace: prefer M*M [VT] + M [tau] + M*NB [work] */
2425 /* RWorkspace: need 0 */
2427 i__1 = *lwork - nwork + 1;
2428 zgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &
2430 zlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
2432 /* Generate Q in VT */
2433 /* CWorkspace: need M*M [VT] + M [tau] + N [work] */
2434 /* CWorkspace: prefer M*M [VT] + M [tau] + N*NB [work] */
2435 /* RWorkspace: need 0 */
2437 i__1 = *lwork - nwork + 1;
2438 zunglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &work[
2439 nwork], &i__1, &ierr);
2441 /* Produce L in A, zeroing out above it */
2445 zlaset_("U", &i__1, &i__2, &c_b1, &c_b1, &a[(a_dim1 << 1) + 1]
2452 /* Bidiagonalize L in A */
2453 /* CWorkspace: need M*M [VT] + 2*M [tauq, taup] + M [work] */
2454 /* CWorkspace: prefer M*M [VT] + 2*M [tauq, taup] + 2*M*NB [work] */
2455 /* RWorkspace: need M [e] */
2457 i__1 = *lwork - nwork + 1;
2458 zgebrd_(m, m, &a[a_offset], lda, &s[1], &rwork[ie], &work[
2459 itauq], &work[itaup], &work[nwork], &i__1, &ierr);
2461 /* Perform bidiagonal SVD, computing left singular vectors */
2462 /* of bidiagonal matrix in RWORK(IRU) and computing right */
2463 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
2464 /* CWorkspace: need 0 */
2465 /* RWorkspace: need M [e] + M*M [RU] + M*M [RVT] + BDSPAC */
2468 irvt = iru + *m * *m;
2469 nrwork = irvt + *m * *m;
2470 dbdsdc_("U", "I", m, &s[1], &rwork[ie], &rwork[iru], m, &
2471 rwork[irvt], m, dum, idum, &rwork[nrwork], &iwork[1],
2474 /* Copy real matrix RWORK(IRU) to complex matrix U */
2475 /* Overwrite U by left singular vectors of L */
2476 /* CWorkspace: need M*M [VT] + 2*M [tauq, taup] + M [work] */
2477 /* CWorkspace: prefer M*M [VT] + 2*M [tauq, taup] + M*NB [work] */
2478 /* RWorkspace: need 0 */
2480 zlacp2_("F", m, m, &rwork[iru], m, &u[u_offset], ldu);
2481 i__1 = *lwork - nwork + 1;
2482 zunmbr_("Q", "L", "N", m, m, m, &a[a_offset], lda, &work[
2483 itauq], &u[u_offset], ldu, &work[nwork], &i__1, &ierr);
2485 /* Copy real matrix RWORK(IRVT) to complex matrix WORK(IVT) */
2486 /* Overwrite WORK(IVT) by right singular vectors of L */
2487 /* CWorkspace: need M*M [VT] + 2*M [tauq, taup] + M [work] */
2488 /* CWorkspace: prefer M*M [VT] + 2*M [tauq, taup] + M*NB [work] */
2489 /* RWorkspace: need 0 */
2491 zlacp2_("F", m, m, &rwork[irvt], m, &work[ivt], &ldwkvt);
2492 i__1 = *lwork - nwork + 1;
2493 zunmbr_("P", "R", "C", m, m, m, &a[a_offset], lda, &work[
2494 itaup], &work[ivt], &ldwkvt, &work[nwork], &i__1, &
2497 /* Multiply right singular vectors of L in WORK(IVT) by */
2498 /* Q in VT, storing result in A */
2499 /* CWorkspace: need M*M [VT] */
2500 /* RWorkspace: need 0 */
2502 zgemm_("N", "N", m, n, m, &c_b2, &work[ivt], &ldwkvt, &vt[
2503 vt_offset], ldvt, &c_b1, &a[a_offset], lda);
2505 /* Copy right singular vectors of A from A to VT */
2507 zlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
2511 } else if (*n >= mnthr2) {
2513 /* MNTHR2 <= N < MNTHR1 */
2515 /* Path 5t (N >> M, but not as much as MNTHR1) */
2516 /* Reduce to bidiagonal form without QR decomposition, use */
2517 /* ZUNGBR and matrix multiplication to compute singular vectors */
2525 /* Bidiagonalize A */
2526 /* CWorkspace: need 2*M [tauq, taup] + N [work] */
2527 /* CWorkspace: prefer 2*M [tauq, taup] + (M+N)*NB [work] */
2528 /* RWorkspace: need M [e] */
2530 i__1 = *lwork - nwork + 1;
2531 zgebrd_(m, n, &a[a_offset], lda, &s[1], &rwork[ie], &work[itauq],
2532 &work[itaup], &work[nwork], &i__1, &ierr);
2536 /* Path 5tn (N >> M, JOBZ='N') */
2537 /* Compute singular values only */
2538 /* CWorkspace: need 0 */
2539 /* RWorkspace: need M [e] + BDSPAC */
2541 dbdsdc_("L", "N", m, &s[1], &rwork[ie], dum, &c__1, dum, &
2542 c__1, dum, idum, &rwork[nrwork], &iwork[1], info);
2545 iru = irvt + *m * *m;
2546 nrwork = iru + *m * *m;
2549 /* Path 5to (N >> M, JOBZ='O') */
2550 /* Copy A to U, generate Q */
2551 /* CWorkspace: need 2*M [tauq, taup] + M [work] */
2552 /* CWorkspace: prefer 2*M [tauq, taup] + M*NB [work] */
2553 /* RWorkspace: need 0 */
2555 zlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu);
2556 i__1 = *lwork - nwork + 1;
2557 zungbr_("Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[
2558 nwork], &i__1, &ierr);
2560 /* Generate P**H in A */
2561 /* CWorkspace: need 2*M [tauq, taup] + M [work] */
2562 /* CWorkspace: prefer 2*M [tauq, taup] + M*NB [work] */
2563 /* RWorkspace: need 0 */
2565 i__1 = *lwork - nwork + 1;
2566 zungbr_("P", m, n, m, &a[a_offset], lda, &work[itaup], &work[
2567 nwork], &i__1, &ierr);
2570 if (*lwork >= *m * *n + *m * 3) {
2572 /* WORK( IVT ) is M by N */
2574 nwork = ivt + ldwkvt * *n;
2578 /* WORK( IVT ) is M by CHUNK */
2580 chunk = (*lwork - *m * 3) / *m;
2581 nwork = ivt + ldwkvt * chunk;
2584 /* Perform bidiagonal SVD, computing left singular vectors */
2585 /* of bidiagonal matrix in RWORK(IRU) and computing right */
2586 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
2587 /* CWorkspace: need 0 */
2588 /* RWorkspace: need M [e] + M*M [RVT] + M*M [RU] + BDSPAC */
2590 dbdsdc_("L", "I", m, &s[1], &rwork[ie], &rwork[iru], m, &
2591 rwork[irvt], m, dum, idum, &rwork[nrwork], &iwork[1],
2594 /* Multiply Q in U by real matrix RWORK(IRVT) */
2595 /* storing the result in WORK(IVT), copying to U */
2596 /* CWorkspace: need 2*M [tauq, taup] + M*M [VT] */
2597 /* RWorkspace: need M [e] + M*M [RVT] + M*M [RU] + 2*M*M [rwork] */
2599 zlacrm_(m, m, &u[u_offset], ldu, &rwork[iru], m, &work[ivt], &
2600 ldwkvt, &rwork[nrwork]);
2601 zlacpy_("F", m, m, &work[ivt], &ldwkvt, &u[u_offset], ldu);
2603 /* Multiply RWORK(IRVT) by P**H in A, storing the */
2604 /* result in WORK(IVT), copying to A */
2605 /* CWorkspace: need 2*M [tauq, taup] + M*M [VT] */
2606 /* CWorkspace: prefer 2*M [tauq, taup] + M*N [VT] */
2607 /* RWorkspace: need M [e] + M*M [RVT] + 2*M*M [rwork] */
2608 /* RWorkspace: prefer M [e] + M*M [RVT] + 2*M*N [rwork] < M + 5*M*M since N < 2*M here */
2613 for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ +=
2616 i__3 = *n - i__ + 1;
2617 blk = f2cmin(i__3,chunk);
2618 zlarcm_(m, &blk, &rwork[irvt], m, &a[i__ * a_dim1 + 1],
2619 lda, &work[ivt], &ldwkvt, &rwork[nrwork]);
2620 zlacpy_("F", m, &blk, &work[ivt], &ldwkvt, &a[i__ *
2626 /* Path 5ts (N >> M, JOBZ='S') */
2627 /* Copy A to U, generate Q */
2628 /* CWorkspace: need 2*M [tauq, taup] + M [work] */
2629 /* CWorkspace: prefer 2*M [tauq, taup] + M*NB [work] */
2630 /* RWorkspace: need 0 */
2632 zlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu);
2633 i__2 = *lwork - nwork + 1;
2634 zungbr_("Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[
2635 nwork], &i__2, &ierr);
2637 /* Copy A to VT, generate P**H */
2638 /* CWorkspace: need 2*M [tauq, taup] + M [work] */
2639 /* CWorkspace: prefer 2*M [tauq, taup] + M*NB [work] */
2640 /* RWorkspace: need 0 */
2642 zlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
2643 i__2 = *lwork - nwork + 1;
2644 zungbr_("P", m, n, m, &vt[vt_offset], ldvt, &work[itaup], &
2645 work[nwork], &i__2, &ierr);
2647 /* Perform bidiagonal SVD, computing left singular vectors */
2648 /* of bidiagonal matrix in RWORK(IRU) and computing right */
2649 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
2650 /* CWorkspace: need 0 */
2651 /* RWorkspace: need M [e] + M*M [RVT] + M*M [RU] + BDSPAC */
2654 iru = irvt + *m * *m;
2655 nrwork = iru + *m * *m;
2656 dbdsdc_("L", "I", m, &s[1], &rwork[ie], &rwork[iru], m, &
2657 rwork[irvt], m, dum, idum, &rwork[nrwork], &iwork[1],
2660 /* Multiply Q in U by real matrix RWORK(IRU), storing the */
2661 /* result in A, copying to U */
2662 /* CWorkspace: need 0 */
2663 /* RWorkspace: need M [e] + M*M [RVT] + M*M [RU] + 2*M*M [rwork] */
2665 zlacrm_(m, m, &u[u_offset], ldu, &rwork[iru], m, &a[a_offset],
2666 lda, &rwork[nrwork]);
2667 zlacpy_("F", m, m, &a[a_offset], lda, &u[u_offset], ldu);
2669 /* Multiply real matrix RWORK(IRVT) by P**H in VT, */
2670 /* storing the result in A, copying to VT */
2671 /* CWorkspace: need 0 */
2672 /* RWorkspace: need M [e] + M*M [RVT] + 2*M*N [rwork] < M + 5*M*M since N < 2*M here */
2675 zlarcm_(m, n, &rwork[irvt], m, &vt[vt_offset], ldvt, &a[
2676 a_offset], lda, &rwork[nrwork]);
2677 zlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
2680 /* Path 5ta (N >> M, JOBZ='A') */
2681 /* Copy A to U, generate Q */
2682 /* CWorkspace: need 2*M [tauq, taup] + M [work] */
2683 /* CWorkspace: prefer 2*M [tauq, taup] + M*NB [work] */
2684 /* RWorkspace: need 0 */
2686 zlacpy_("L", m, m, &a[a_offset], lda, &u[u_offset], ldu);
2687 i__2 = *lwork - nwork + 1;
2688 zungbr_("Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[
2689 nwork], &i__2, &ierr);
2691 /* Copy A to VT, generate P**H */
2692 /* CWorkspace: need 2*M [tauq, taup] + N [work] */
2693 /* CWorkspace: prefer 2*M [tauq, taup] + N*NB [work] */
2694 /* RWorkspace: need 0 */
2696 zlacpy_("U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
2697 i__2 = *lwork - nwork + 1;
2698 zungbr_("P", n, n, m, &vt[vt_offset], ldvt, &work[itaup], &
2699 work[nwork], &i__2, &ierr);
2701 /* Perform bidiagonal SVD, computing left singular vectors */
2702 /* of bidiagonal matrix in RWORK(IRU) and computing right */
2703 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
2704 /* CWorkspace: need 0 */
2705 /* RWorkspace: need M [e] + M*M [RVT] + M*M [RU] + BDSPAC */
2708 iru = irvt + *m * *m;
2709 nrwork = iru + *m * *m;
2710 dbdsdc_("L", "I", m, &s[1], &rwork[ie], &rwork[iru], m, &
2711 rwork[irvt], m, dum, idum, &rwork[nrwork], &iwork[1],
2714 /* Multiply Q in U by real matrix RWORK(IRU), storing the */
2715 /* result in A, copying to U */
2716 /* CWorkspace: need 0 */
2717 /* RWorkspace: need M [e] + M*M [RVT] + M*M [RU] + 2*M*M [rwork] */
2719 zlacrm_(m, m, &u[u_offset], ldu, &rwork[iru], m, &a[a_offset],
2720 lda, &rwork[nrwork]);
2721 zlacpy_("F", m, m, &a[a_offset], lda, &u[u_offset], ldu);
2723 /* Multiply real matrix RWORK(IRVT) by P**H in VT, */
2724 /* storing the result in A, copying to VT */
2725 /* CWorkspace: need 0 */
2726 /* RWorkspace: need M [e] + M*M [RVT] + 2*M*N [rwork] < M + 5*M*M since N < 2*M here */
2729 zlarcm_(m, n, &rwork[irvt], m, &vt[vt_offset], ldvt, &a[
2730 a_offset], lda, &rwork[nrwork]);
2731 zlacpy_("F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt);
2738 /* Path 6t (N > M, but not much larger) */
2739 /* Reduce to bidiagonal form without LQ decomposition */
2740 /* Use ZUNMBR to compute singular vectors */
2748 /* Bidiagonalize A */
2749 /* CWorkspace: need 2*M [tauq, taup] + N [work] */
2750 /* CWorkspace: prefer 2*M [tauq, taup] + (M+N)*NB [work] */
2751 /* RWorkspace: need M [e] */
2753 i__2 = *lwork - nwork + 1;
2754 zgebrd_(m, n, &a[a_offset], lda, &s[1], &rwork[ie], &work[itauq],
2755 &work[itaup], &work[nwork], &i__2, &ierr);
2758 /* Path 6tn (N > M, JOBZ='N') */
2759 /* Compute singular values only */
2760 /* CWorkspace: need 0 */
2761 /* RWorkspace: need M [e] + BDSPAC */
2763 dbdsdc_("L", "N", m, &s[1], &rwork[ie], dum, &c__1, dum, &
2764 c__1, dum, idum, &rwork[nrwork], &iwork[1], info);
2766 /* Path 6to (N > M, JOBZ='O') */
2769 if (*lwork >= *m * *n + *m * 3) {
2771 /* WORK( IVT ) is M by N */
2773 zlaset_("F", m, n, &c_b1, &c_b1, &work[ivt], &ldwkvt);
2774 nwork = ivt + ldwkvt * *n;
2777 /* WORK( IVT ) is M by CHUNK */
2779 chunk = (*lwork - *m * 3) / *m;
2780 nwork = ivt + ldwkvt * chunk;
2783 /* Perform bidiagonal SVD, computing left singular vectors */
2784 /* of bidiagonal matrix in RWORK(IRU) and computing right */
2785 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
2786 /* CWorkspace: need 0 */
2787 /* RWorkspace: need M [e] + M*M [RVT] + M*M [RU] + BDSPAC */
2790 iru = irvt + *m * *m;
2791 nrwork = iru + *m * *m;
2792 dbdsdc_("L", "I", m, &s[1], &rwork[ie], &rwork[iru], m, &
2793 rwork[irvt], m, dum, idum, &rwork[nrwork], &iwork[1],
2796 /* Copy real matrix RWORK(IRU) to complex matrix U */
2797 /* Overwrite U by left singular vectors of A */
2798 /* CWorkspace: need 2*M [tauq, taup] + M*M [VT] + M [work] */
2799 /* CWorkspace: prefer 2*M [tauq, taup] + M*M [VT] + M*NB [work] */
2800 /* RWorkspace: need M [e] + M*M [RVT] + M*M [RU] */
2802 zlacp2_("F", m, m, &rwork[iru], m, &u[u_offset], ldu);
2803 i__2 = *lwork - nwork + 1;
2804 zunmbr_("Q", "L", "N", m, m, n, &a[a_offset], lda, &work[
2805 itauq], &u[u_offset], ldu, &work[nwork], &i__2, &ierr);
2807 if (*lwork >= *m * *n + *m * 3) {
2810 /* Copy real matrix RWORK(IRVT) to complex matrix WORK(IVT) */
2811 /* Overwrite WORK(IVT) by right singular vectors of A, */
2813 /* CWorkspace: need 2*M [tauq, taup] + M*N [VT] + M [work] */
2814 /* CWorkspace: prefer 2*M [tauq, taup] + M*N [VT] + M*NB [work] */
2815 /* RWorkspace: need M [e] + M*M [RVT] */
2817 zlacp2_("F", m, m, &rwork[irvt], m, &work[ivt], &ldwkvt);
2818 i__2 = *lwork - nwork + 1;
2819 zunmbr_("P", "R", "C", m, n, m, &a[a_offset], lda, &work[
2820 itaup], &work[ivt], &ldwkvt, &work[nwork], &i__2,
2822 zlacpy_("F", m, n, &work[ivt], &ldwkvt, &a[a_offset], lda);
2826 /* Generate P**H in A */
2827 /* CWorkspace: need 2*M [tauq, taup] + M*M [VT] + M [work] */
2828 /* CWorkspace: prefer 2*M [tauq, taup] + M*M [VT] + M*NB [work] */
2829 /* RWorkspace: need 0 */
2831 i__2 = *lwork - nwork + 1;
2832 zungbr_("P", m, n, m, &a[a_offset], lda, &work[itaup], &
2833 work[nwork], &i__2, &ierr);
2835 /* Multiply Q in A by real matrix RWORK(IRU), storing the */
2836 /* result in WORK(IU), copying to A */
2837 /* CWorkspace: need 2*M [tauq, taup] + M*M [VT] */
2838 /* CWorkspace: prefer 2*M [tauq, taup] + M*N [VT] */
2839 /* RWorkspace: need M [e] + M*M [RVT] + 2*M*M [rwork] */
2840 /* RWorkspace: prefer M [e] + M*M [RVT] + 2*M*N [rwork] < M + 5*M*M since N < 2*M here */
2845 for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ +=
2848 i__3 = *n - i__ + 1;
2849 blk = f2cmin(i__3,chunk);
2850 zlarcm_(m, &blk, &rwork[irvt], m, &a[i__ * a_dim1 + 1]
2851 , lda, &work[ivt], &ldwkvt, &rwork[nrwork]);
2852 zlacpy_("F", m, &blk, &work[ivt], &ldwkvt, &a[i__ *
2859 /* Path 6ts (N > M, JOBZ='S') */
2860 /* Perform bidiagonal SVD, computing left singular vectors */
2861 /* of bidiagonal matrix in RWORK(IRU) and computing right */
2862 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
2863 /* CWorkspace: need 0 */
2864 /* RWorkspace: need M [e] + M*M [RVT] + M*M [RU] + BDSPAC */
2867 iru = irvt + *m * *m;
2868 nrwork = iru + *m * *m;
2869 dbdsdc_("L", "I", m, &s[1], &rwork[ie], &rwork[iru], m, &
2870 rwork[irvt], m, dum, idum, &rwork[nrwork], &iwork[1],
2873 /* Copy real matrix RWORK(IRU) to complex matrix U */
2874 /* Overwrite U by left singular vectors of A */
2875 /* CWorkspace: need 2*M [tauq, taup] + M [work] */
2876 /* CWorkspace: prefer 2*M [tauq, taup] + M*NB [work] */
2877 /* RWorkspace: need M [e] + M*M [RVT] + M*M [RU] */
2879 zlacp2_("F", m, m, &rwork[iru], m, &u[u_offset], ldu);
2880 i__1 = *lwork - nwork + 1;
2881 zunmbr_("Q", "L", "N", m, m, n, &a[a_offset], lda, &work[
2882 itauq], &u[u_offset], ldu, &work[nwork], &i__1, &ierr);
2884 /* Copy real matrix RWORK(IRVT) to complex matrix VT */
2885 /* Overwrite VT by right singular vectors of A */
2886 /* CWorkspace: need 2*M [tauq, taup] + M [work] */
2887 /* CWorkspace: prefer 2*M [tauq, taup] + M*NB [work] */
2888 /* RWorkspace: need M [e] + M*M [RVT] */
2890 zlaset_("F", m, n, &c_b1, &c_b1, &vt[vt_offset], ldvt);
2891 zlacp2_("F", m, m, &rwork[irvt], m, &vt[vt_offset], ldvt);
2892 i__1 = *lwork - nwork + 1;
2893 zunmbr_("P", "R", "C", m, n, m, &a[a_offset], lda, &work[
2894 itaup], &vt[vt_offset], ldvt, &work[nwork], &i__1, &
2898 /* Path 6ta (N > M, JOBZ='A') */
2899 /* Perform bidiagonal SVD, computing left singular vectors */
2900 /* of bidiagonal matrix in RWORK(IRU) and computing right */
2901 /* singular vectors of bidiagonal matrix in RWORK(IRVT) */
2902 /* CWorkspace: need 0 */
2903 /* RWorkspace: need M [e] + M*M [RVT] + M*M [RU] + BDSPAC */
2906 iru = irvt + *m * *m;
2907 nrwork = iru + *m * *m;
2909 dbdsdc_("L", "I", m, &s[1], &rwork[ie], &rwork[iru], m, &
2910 rwork[irvt], m, dum, idum, &rwork[nrwork], &iwork[1],
2913 /* Copy real matrix RWORK(IRU) to complex matrix U */
2914 /* Overwrite U by left singular vectors of A */
2915 /* CWorkspace: need 2*M [tauq, taup] + M [work] */
2916 /* CWorkspace: prefer 2*M [tauq, taup] + M*NB [work] */
2917 /* RWorkspace: need M [e] + M*M [RVT] + M*M [RU] */
2919 zlacp2_("F", m, m, &rwork[iru], m, &u[u_offset], ldu);
2920 i__1 = *lwork - nwork + 1;
2921 zunmbr_("Q", "L", "N", m, m, n, &a[a_offset], lda, &work[
2922 itauq], &u[u_offset], ldu, &work[nwork], &i__1, &ierr);
2924 /* Set all of VT to identity matrix */
2926 zlaset_("F", n, n, &c_b1, &c_b2, &vt[vt_offset], ldvt);
2928 /* Copy real matrix RWORK(IRVT) to complex matrix VT */
2929 /* Overwrite VT by right singular vectors of A */
2930 /* CWorkspace: need 2*M [tauq, taup] + N [work] */
2931 /* CWorkspace: prefer 2*M [tauq, taup] + N*NB [work] */
2932 /* RWorkspace: need M [e] + M*M [RVT] */
2934 zlacp2_("F", m, m, &rwork[irvt], m, &vt[vt_offset], ldvt);
2935 i__1 = *lwork - nwork + 1;
2936 zunmbr_("P", "R", "C", n, n, m, &a[a_offset], lda, &work[
2937 itaup], &vt[vt_offset], ldvt, &work[nwork], &i__1, &
2945 /* Undo scaling if necessary */
2948 if (anrm > bignum) {
2949 dlascl_("G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], &
2952 if (*info != 0 && anrm > bignum) {
2954 dlascl_("G", &c__0, &c__0, &bignum, &anrm, &i__1, &c__1, &rwork[
2955 ie], &minmn, &ierr);
2957 if (anrm < smlnum) {
2958 dlascl_("G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], &
2961 if (*info != 0 && anrm < smlnum) {
2963 dlascl_("G", &c__0, &c__0, &smlnum, &anrm, &i__1, &c__1, &rwork[
2964 ie], &minmn, &ierr);
2968 /* Return optimal workspace in WORK(1) */
2970 work[1].r = (doublereal) maxwrk, work[1].i = 0.;