📄 cgesdd.c
字号:
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNMBR", "PRC", n, n, n, &c_n1, (ftnlen)6, (
ftnlen)3);
wrkbl = max(i__1,i__2);
maxwrk = *n * *n + wrkbl;
minwrk = *n * *n + *n * 3;
} else if (wntqa) {
/* Path 4 (M much larger than N, JOBZ='A') */
wrkbl = *n + *n * ilaenv_(&c__1, "CGEQRF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *n + *m * ilaenv_(&c__1, "CUNGQR",
" ", m, m, n, &c_n1, (ftnlen)6, (ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*n << 1) + (*n << 1) * ilaenv_(&
c__1, "CGEBRD", " ", n, n, &c_n1, &c_n1, (ftnlen)
6, (ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNMBR", "QLN", n, n, n, &c_n1, (ftnlen)6, (
ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNMBR", "PRC", n, n, n, &c_n1, (ftnlen)6, (
ftnlen)3);
wrkbl = max(i__1,i__2);
maxwrk = *n * *n + wrkbl;
minwrk = *n * *n + (*n << 1) + *m;
}
} else if (*m >= mnthr2) {
/* Path 5 (M much larger than N, but not as much as MNTHR1) */
maxwrk = (*n << 1) + (*m + *n) * ilaenv_(&c__1, "CGEBRD",
" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
minwrk = (*n << 1) + *m;
if (wntqo) {
/* Computing MAX */
i__1 = maxwrk, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNGBR", "P", n, n, n, &c_n1, (ftnlen)6, (ftnlen)
1);
maxwrk = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNGBR", "Q", m, n, n, &c_n1, (ftnlen)6, (ftnlen)
1);
maxwrk = max(i__1,i__2);
maxwrk += *m * *n;
minwrk += *n * *n;
} else if (wntqs) {
/* Computing MAX */
i__1 = maxwrk, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNGBR", "P", n, n, n, &c_n1, (ftnlen)6, (ftnlen)
1);
maxwrk = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNGBR", "Q", m, n, n, &c_n1, (ftnlen)6, (ftnlen)
1);
maxwrk = max(i__1,i__2);
} else if (wntqa) {
/* Computing MAX */
i__1 = maxwrk, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNGBR", "P", n, n, n, &c_n1, (ftnlen)6, (ftnlen)
1);
maxwrk = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*n << 1) + *m * ilaenv_(&c__1,
"CUNGBR", "Q", m, m, n, &c_n1, (ftnlen)6, (ftnlen)
1);
maxwrk = max(i__1,i__2);
}
} else {
/* Path 6 (M at least N, but not much larger) */
maxwrk = (*n << 1) + (*m + *n) * ilaenv_(&c__1, "CGEBRD",
" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
minwrk = (*n << 1) + *m;
if (wntqo) {
/* Computing MAX */
i__1 = maxwrk, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNMBR", "PRC", n, n, n, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNMBR", "QLN", m, n, n, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
maxwrk += *m * *n;
minwrk += *n * *n;
} else if (wntqs) {
/* Computing MAX */
i__1 = maxwrk, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNMBR", "PRC", n, n, n, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNMBR", "QLN", m, n, n, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
} else if (wntqa) {
/* Computing MAX */
i__1 = maxwrk, i__2 = (*n << 1) + *n * ilaenv_(&c__1,
"CUNGBR", "PRC", n, n, n, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*n << 1) + *m * ilaenv_(&c__1,
"CUNGBR", "QLN", m, m, n, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
}
}
} else {
/* There is no complex work space needed for bidiagonal SVD
The real work space needed for bidiagonal SVD is BDSPAC,
BDSPAC = 3*M*M + 4*M */
if (*n >= mnthr1) {
if (wntqn) {
/* Path 1t (N much larger than M, JOBZ='N') */
maxwrk = *m + *m * ilaenv_(&c__1, "CGELQF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + (*m << 1) * ilaenv_(&
c__1, "CGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)
6, (ftnlen)1);
maxwrk = max(i__1,i__2);
minwrk = *m * 3;
} else if (wntqo) {
/* Path 2t (N much larger than M, JOBZ='O') */
wrkbl = *m + *m * ilaenv_(&c__1, "CGELQF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m + *m * ilaenv_(&c__1, "CUNGLQ",
" ", m, n, m, &c_n1, (ftnlen)6, (ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*m << 1) + (*m << 1) * ilaenv_(&
c__1, "CGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)
6, (ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNMBR", "PRC", m, m, m, &c_n1, (ftnlen)6, (
ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNMBR", "QLN", m, m, m, &c_n1, (ftnlen)6, (
ftnlen)3);
wrkbl = max(i__1,i__2);
maxwrk = *m * *n + *m * *m + wrkbl;
minwrk = (*m << 1) * *m + *m * 3;
} else if (wntqs) {
/* Path 3t (N much larger than M, JOBZ='S') */
wrkbl = *m + *m * ilaenv_(&c__1, "CGELQF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m + *m * ilaenv_(&c__1, "CUNGLQ",
" ", m, n, m, &c_n1, (ftnlen)6, (ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*m << 1) + (*m << 1) * ilaenv_(&
c__1, "CGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)
6, (ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNMBR", "PRC", m, m, m, &c_n1, (ftnlen)6, (
ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNMBR", "QLN", m, m, m, &c_n1, (ftnlen)6, (
ftnlen)3);
wrkbl = max(i__1,i__2);
maxwrk = *m * *m + wrkbl;
minwrk = *m * *m + *m * 3;
} else if (wntqa) {
/* Path 4t (N much larger than M, JOBZ='A') */
wrkbl = *m + *m * ilaenv_(&c__1, "CGELQF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m + *n * ilaenv_(&c__1, "CUNGLQ",
" ", n, n, m, &c_n1, (ftnlen)6, (ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*m << 1) + (*m << 1) * ilaenv_(&
c__1, "CGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)
6, (ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNMBR", "PRC", m, m, m, &c_n1, (ftnlen)6, (
ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNMBR", "QLN", m, m, m, &c_n1, (ftnlen)6, (
ftnlen)3);
wrkbl = max(i__1,i__2);
maxwrk = *m * *m + wrkbl;
minwrk = *m * *m + (*m << 1) + *n;
}
} else if (*n >= mnthr2) {
/* Path 5t (N much larger than M, but not as much as MNTHR1) */
maxwrk = (*m << 1) + (*m + *n) * ilaenv_(&c__1, "CGEBRD",
" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
minwrk = (*m << 1) + *n;
if (wntqo) {
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNGBR", "P", m, n, m, &c_n1, (ftnlen)6, (ftnlen)
1);
maxwrk = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNGBR", "Q", m, m, n, &c_n1, (ftnlen)6, (ftnlen)
1);
maxwrk = max(i__1,i__2);
maxwrk += *m * *n;
minwrk += *m * *m;
} else if (wntqs) {
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNGBR", "P", m, n, m, &c_n1, (ftnlen)6, (ftnlen)
1);
maxwrk = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNGBR", "Q", m, m, n, &c_n1, (ftnlen)6, (ftnlen)
1);
maxwrk = max(i__1,i__2);
} else if (wntqa) {
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + *n * ilaenv_(&c__1,
"CUNGBR", "P", n, n, m, &c_n1, (ftnlen)6, (ftnlen)
1);
maxwrk = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNGBR", "Q", m, m, n, &c_n1, (ftnlen)6, (ftnlen)
1);
maxwrk = max(i__1,i__2);
}
} else {
/* Path 6t (N greater than M, but not much larger) */
maxwrk = (*m << 1) + (*m + *n) * ilaenv_(&c__1, "CGEBRD",
" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
minwrk = (*m << 1) + *n;
if (wntqo) {
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNMBR", "PRC", m, n, m, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNMBR", "QLN", m, m, n, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
maxwrk += *m * *n;
minwrk += *m * *m;
} else if (wntqs) {
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNGBR", "PRC", m, n, m, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNGBR", "QLN", m, m, n, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
} else if (wntqa) {
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + *n * ilaenv_(&c__1,
"CUNGBR", "PRC", n, n, m, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + *m * ilaenv_(&c__1,
"CUNGBR", "QLN", m, m, n, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
}
}
}
maxwrk = max(maxwrk,minwrk);
work[1].r = (real) maxwrk, work[1].i = 0.f;
}
if (*lwork < minwrk && ! lquery) {
*info = -13;
}
if (*info != 0) {
i__1 = -(*info);
xerbla_("CGESDD", &i__1);
return 0;
} else if (lquery) {
return 0;
}
/* Quick return if possible */
if (*m == 0 || *n == 0) {
if (*lwork >= 1) {
work[1].r = 1.f, work[1].i = 0.f;
}
return 0;
}
/* Get machine constants */
eps = slamch_("P");
smlnum = sqrt(slamch_("S")) / eps;
bignum = 1.f / smlnum;
/* Scale A if max element outside range [SMLNUM,BIGNUM] */
anrm = clange_("M", m, n, &a[a_offset], lda, dum);
iscl = 0;
if (anrm > 0.f && anrm < smlnum) {
iscl = 1;
latime_1.ops += (real) (*m * 6 * *n);
clascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, &
ierr);
} else if (anrm > bignum) {
iscl = 1;
latime_1.ops += (real) (*m * 6 * *n);
clascl_("G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, &
ierr);
}
if (*m >= *n) {
/* A has at least as many rows as columns. If A has sufficiently
more rows than columns, first reduce using the QR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -