📄 zgesdd.c
字号:
wrkbl = *n + *n * ilaenv_(&c__1, "ZGEQRF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *n + *n * ilaenv_(&c__1, "ZUNGQR",
" ", m, n, 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, "ZGEBRD", " ", 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,
"ZUNMBR", "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,
"ZUNMBR", "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, "ZGEQRF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *n + *m * ilaenv_(&c__1, "ZUNGQR",
" ", 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, "ZGEBRD", " ", 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,
"ZUNMBR", "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,
"ZUNMBR", "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, "ZGEBRD",
" ", 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,
"ZUNGBR", "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,
"ZUNGBR", "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,
"ZUNGBR", "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,
"ZUNGBR", "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,
"ZUNGBR", "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,
"ZUNGBR", "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, "ZGEBRD",
" ", 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,
"ZUNMBR", "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,
"ZUNMBR", "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,
"ZUNMBR", "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,
"ZUNMBR", "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,
"ZUNGBR", "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,
"ZUNGBR", "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, "ZGELQF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = maxwrk, i__2 = (*m << 1) + (*m << 1) * ilaenv_(&
c__1, "ZGEBRD", " ", 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, "ZGELQF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m + *m * ilaenv_(&c__1, "ZUNGLQ",
" ", 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, "ZGEBRD", " ", 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,
"ZUNMBR", "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,
"ZUNMBR", "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, "ZGELQF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m + *m * ilaenv_(&c__1, "ZUNGLQ",
" ", 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, "ZGEBRD", " ", 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,
"ZUNMBR", "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,
"ZUNMBR", "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, "ZGELQF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m + *n * ilaenv_(&c__1, "ZUNGLQ",
" ", 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, "ZGEBRD", " ", 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,
"ZUNMBR", "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,
"ZUNMBR", "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, "ZGEBRD",
" ", 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,
"ZUNGBR", "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,
"ZUNGBR", "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,
"ZUNGBR", "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,
"ZUNGBR", "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,
"ZUNGBR", "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,
"ZUNGBR", "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, "ZGEBRD",
" ", 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,
"ZUNMBR", "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,
"ZUNMBR", "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,
"ZUNGBR", "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,
"ZUNGBR", "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,
"ZUNGBR", "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,
"ZUNGBR", "QLN", m, m, n, &c_n1, (ftnlen)6, (
ftnlen)3);
maxwrk = max(i__1,i__2);
}
}
}
maxwrk = max(maxwrk,minwrk);
work[1].r = (doublereal) maxwrk, work[1].i = 0.;
}
if (*lwork < minwrk && ! lquery) {
*info = -13;
}
if (*info != 0) {
i__1 = -(*info);
xerbla_("ZGESDD", &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., work[1].i = 0.;
}
return 0;
}
/* Get machine constants */
eps = dlamch_("P");
smlnum = sqrt(dlamch_("S")) / eps;
bignum = 1. / smlnum;
/* Scale A if max element outside range [SMLNUM,BIGNUM] */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -