📄 dgesdd.c
字号:
/* Computing MAX */
i__1 = wrkbl, i__2 = *n * 3 + *n * ilaenv_(&c__1, "DORMBR"
, "PRT", n, n, n, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *n * 3;
wrkbl = max(i__1,i__2);
maxwrk = wrkbl + *n * *n;
minwrk = bdspac + *n * *n + *n * 3;
} else if (wntqa) {
/* Path 4 (M much larger than N, JOBZ='A') */
wrkbl = *n + *n * ilaenv_(&c__1, "DGEQRF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *n + *m * ilaenv_(&c__1, "DORGQR",
" ", m, m, n, &c_n1, (ftnlen)6, (ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *n * 3 + (*n << 1) * ilaenv_(&c__1,
"DGEBRD", " ", n, n, &c_n1, &c_n1, (ftnlen)6, (
ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *n * 3 + *n * ilaenv_(&c__1, "DORMBR"
, "QLN", n, n, n, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *n * 3 + *n * ilaenv_(&c__1, "DORMBR"
, "PRT", n, n, n, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *n * 3;
wrkbl = max(i__1,i__2);
maxwrk = wrkbl + *n * *n;
minwrk = bdspac + *n * *n + *n * 3;
}
} else {
/* Path 5 (M at least N, but not much larger) */
wrkbl = *n * 3 + (*m + *n) * ilaenv_(&c__1, "DGEBRD", " ", m,
n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
if (wntqn) {
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *n * 3;
maxwrk = max(i__1,i__2);
minwrk = *n * 3 + max(*m,bdspac);
} else if (wntqo) {
/* Computing MAX */
i__1 = wrkbl, i__2 = *n * 3 + *n * ilaenv_(&c__1, "DORMBR"
, "QLN", m, n, n, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *n * 3 + *n * ilaenv_(&c__1, "DORMBR"
, "PRT", n, n, n, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *n * 3;
wrkbl = max(i__1,i__2);
maxwrk = wrkbl + *m * *n;
/* Computing MAX */
i__1 = *m, i__2 = *n * *n + bdspac;
minwrk = *n * 3 + max(i__1,i__2);
} else if (wntqs) {
/* Computing MAX */
i__1 = wrkbl, i__2 = *n * 3 + *n * ilaenv_(&c__1, "DORMBR"
, "QLN", m, n, n, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *n * 3 + *n * ilaenv_(&c__1, "DORMBR"
, "PRT", n, n, n, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *n * 3;
maxwrk = max(i__1,i__2);
minwrk = *n * 3 + max(*m,bdspac);
} else if (wntqa) {
/* Computing MAX */
i__1 = wrkbl, i__2 = *n * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "QLN", m, m, n, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *n * 3 + *n * ilaenv_(&c__1, "DORMBR"
, "PRT", n, n, n, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = maxwrk, i__2 = bdspac + *n * 3;
maxwrk = max(i__1,i__2);
minwrk = *n * 3 + max(*m,bdspac);
}
}
} else {
/* Compute space needed for DBDSDC */
if (wntqn) {
bdspac = *m * 7;
} else {
bdspac = *m * 3 * *m + (*m << 2);
}
if (*n >= mnthr) {
if (wntqn) {
/* Path 1t (N much larger than M, JOBZ='N') */
wrkbl = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + (*m << 1) * ilaenv_(&c__1,
"DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, (
ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *m;
maxwrk = max(i__1,i__2);
minwrk = bdspac + *m;
} else if (wntqo) {
/* Path 2t (N much larger than M, JOBZ='O') */
wrkbl = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m + *m * ilaenv_(&c__1, "DORGLQ",
" ", m, n, m, &c_n1, (ftnlen)6, (ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + (*m << 1) * ilaenv_(&c__1,
"DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, (
ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "QLN", m, m, m, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "PRT", m, m, m, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *m * 3;
wrkbl = max(i__1,i__2);
maxwrk = wrkbl + (*m << 1) * *m;
minwrk = bdspac + (*m << 1) * *m + *m * 3;
} else if (wntqs) {
/* Path 3t (N much larger than M, JOBZ='S') */
wrkbl = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m + *m * ilaenv_(&c__1, "DORGLQ",
" ", m, n, m, &c_n1, (ftnlen)6, (ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + (*m << 1) * ilaenv_(&c__1,
"DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, (
ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "QLN", m, m, m, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "PRT", m, m, m, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *m * 3;
wrkbl = max(i__1,i__2);
maxwrk = wrkbl + *m * *m;
minwrk = bdspac + *m * *m + *m * 3;
} else if (wntqa) {
/* Path 4t (N much larger than M, JOBZ='A') */
wrkbl = *m + *m * ilaenv_(&c__1, "DGELQF", " ", m, n, &
c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m + *n * ilaenv_(&c__1, "DORGLQ",
" ", n, n, m, &c_n1, (ftnlen)6, (ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + (*m << 1) * ilaenv_(&c__1,
"DGEBRD", " ", m, m, &c_n1, &c_n1, (ftnlen)6, (
ftnlen)1);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "QLN", m, m, m, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "PRT", m, m, m, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *m * 3;
wrkbl = max(i__1,i__2);
maxwrk = wrkbl + *m * *m;
minwrk = bdspac + *m * *m + *m * 3;
}
} else {
/* Path 5t (N greater than M, but not much larger) */
wrkbl = *m * 3 + (*m + *n) * ilaenv_(&c__1, "DGEBRD", " ", m,
n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1);
if (wntqn) {
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *m * 3;
maxwrk = max(i__1,i__2);
minwrk = *m * 3 + max(*n,bdspac);
} else if (wntqo) {
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "QLN", m, m, n, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "PRT", m, n, m, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *m * 3;
wrkbl = max(i__1,i__2);
maxwrk = wrkbl + *m * *n;
/* Computing MAX */
i__1 = *n, i__2 = *m * *m + bdspac;
minwrk = *m * 3 + max(i__1,i__2);
} else if (wntqs) {
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "QLN", m, m, n, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "PRT", m, n, m, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *m * 3;
maxwrk = max(i__1,i__2);
minwrk = *m * 3 + max(*n,bdspac);
} else if (wntqa) {
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "QLN", m, m, n, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = *m * 3 + *m * ilaenv_(&c__1, "DORMBR"
, "PRT", n, n, m, &c_n1, (ftnlen)6, (ftnlen)3);
wrkbl = max(i__1,i__2);
/* Computing MAX */
i__1 = wrkbl, i__2 = bdspac + *m * 3;
maxwrk = max(i__1,i__2);
minwrk = *m * 3 + max(*n,bdspac);
}
}
}
work[1] = (doublereal) maxwrk;
}
if (*lwork < minwrk && ! lquery) {
*info = -12;
}
if (*info != 0) {
i__1 = -(*info);
xerbla_("DGESDD", &i__1);
return 0;
} else if (lquery) {
return 0;
}
/* Quick return if possible */
if (*m == 0 || *n == 0) {
if (*lwork >= 1) {
work[1] = 1.;
}
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] */
anrm = dlange_("M", m, n, &a[a_offset], lda, dum);
iscl = 0;
if (anrm > 0. && anrm < smlnum) {
iscl = 1;
latime_1.ops += (doublereal) (*m * *n);
dlascl_("G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, &
ierr);
} else if (anrm > bignum) {
iscl = 1;
latime_1.ops += (doublereal) (*m * *n);
dlascl_("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
decomposition (if sufficient workspace available) */
if (*m >= mnthr) {
if (wntqn) {
/* Path 1 (M much larger than N, JOBZ='N')
No singular vectors to be computed */
itau = 1;
nwork = itau + *n;
/* Compute A=Q*R
(Workspace: need 2*N, prefer N+N*NB) */
nb = ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1, (
ftnlen)6, (ftnlen)1);
latime_1.ops += dopla_("DGEQRF", m, n, &c__0, &c__0, &nb);
i__1 = *lwork - nwork + 1;
dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &
i__1, &ierr);
/* Zero out below R */
i__1 = *n - 1;
i__2 = *n - 1;
dlaset_("L", &i__1, &i__2, &c_b235, &c_b235, &a_ref(2, 1),
lda);
ie = 1;
itauq = ie + *n;
itaup = itauq + *n;
nwork = itaup + *n;
/* Bidiagonalize R in A
(Workspace: need 4*N, prefer 3*N+2*N*NB) */
nb = ilaenv_(&c__1, "DGEBRD", " ", n, n, &c_n1, &c_n1, (
ftnlen)6, (ftnlen)1);
latime_1.ops += dopla_("DGEBRD", n, n, &c__0, &c__0, &nb);
i__1 = *lwork - nwork + 1;
dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[
itauq], &work[itaup], &work[nwork], &i__1, &ierr);
nwork = ie + *n;
/* Perform bidiagonal SVD, computing singular values only
(Workspace: need N+BDSPAC) */
dbdsdc_("U", "N", n, &s[1], &work[ie], dum, &c__1, dum, &c__1,
dum, idum, &work[nwork], &iwork[1], info);
} else if (wntqo) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -