📄 slaein.c
字号:
/* ** */
} else {
/* Complex eigenvalue. */
if (*noinit) {
/* Set initial vector. */
i__1 = *n;
for (i__ = 1; i__ <= i__1; ++i__) {
vr[i__] = *eps3;
vi[i__] = 0.f;
/* L130: */
}
} else {
/* Scale supplied initial vector. */
r__1 = snrm2_(n, &vr[1], &c__1);
r__2 = snrm2_(n, &vi[1], &c__1);
norm = slapy2_(&r__1, &r__2);
rec = *eps3 * rootn / dmax(norm,nrmsml);
sscal_(n, &rec, &vr[1], &c__1);
sscal_(n, &rec, &vi[1], &c__1);
/* ** */
opst += *n * 6 + 5;
/* ** */
}
if (*rightv) {
/* LU decomposition with partial pivoting of B, replacing zero
pivots by EPS3.
The imaginary part of the (i,j)-th element of U is stored in
B(j+1,i). */
b_ref(2, 1) = -(*wi);
i__1 = *n;
for (i__ = 2; i__ <= i__1; ++i__) {
b_ref(i__ + 1, 1) = 0.f;
/* L140: */
}
i__1 = *n - 1;
for (i__ = 1; i__ <= i__1; ++i__) {
absbii = slapy2_(&b_ref(i__, i__), &b_ref(i__ + 1, i__));
ei = h___ref(i__ + 1, i__);
if (absbii < dabs(ei)) {
/* Interchange rows and eliminate. */
xr = b_ref(i__, i__) / ei;
xi = b_ref(i__ + 1, i__) / ei;
b_ref(i__, i__) = ei;
b_ref(i__ + 1, i__) = 0.f;
i__2 = *n;
for (j = i__ + 1; j <= i__2; ++j) {
temp = b_ref(i__ + 1, j);
b_ref(i__ + 1, j) = b_ref(i__, j) - xr * temp;
b_ref(j + 1, i__ + 1) = b_ref(j + 1, i__) - xi * temp;
b_ref(i__, j) = temp;
b_ref(j + 1, i__) = 0.f;
/* L150: */
}
b_ref(i__ + 2, i__) = -(*wi);
b_ref(i__ + 1, i__ + 1) = b_ref(i__ + 1, i__ + 1) - xi * *
wi;
b_ref(i__ + 2, i__ + 1) = b_ref(i__ + 2, i__ + 1) + xr * *
wi;
/* ** */
opst += (*n - i__ << 2) + 6;
/* ** */
} else {
/* Eliminate without interchanging rows. */
if (absbii == 0.f) {
b_ref(i__, i__) = *eps3;
b_ref(i__ + 1, i__) = 0.f;
absbii = *eps3;
}
ei = ei / absbii / absbii;
xr = b_ref(i__, i__) * ei;
xi = -b_ref(i__ + 1, i__) * ei;
i__2 = *n;
for (j = i__ + 1; j <= i__2; ++j) {
b_ref(i__ + 1, j) = b_ref(i__ + 1, j) - xr * b_ref(
i__, j) + xi * b_ref(j + 1, i__);
b_ref(j + 1, i__ + 1) = -xr * b_ref(j + 1, i__) - xi *
b_ref(i__, j);
/* L160: */
}
b_ref(i__ + 2, i__ + 1) = b_ref(i__ + 2, i__ + 1) - *wi;
/* ** */
opst += (*n - i__) * 7 + 4;
/* ** */
}
/* Compute 1-norm of offdiagonal elements of i-th row. */
i__2 = *n - i__;
i__3 = *n - i__;
work[i__] = sasum_(&i__2, &b_ref(i__, i__ + 1), ldb) + sasum_(
&i__3, &b_ref(i__ + 2, i__), &c__1);
/* ** */
opst += (*n - i__ << 1) + 4;
/* **
L170: */
}
if (b_ref(*n, *n) == 0.f && b_ref(*n + 1, *n) == 0.f) {
b_ref(*n, *n) = *eps3;
}
work[*n] = 0.f;
i1 = *n;
i2 = 1;
i3 = -1;
} else {
/* UL decomposition with partial pivoting of conjg(B),
replacing zero pivots by EPS3.
The imaginary part of the (i,j)-th element of U is stored in
B(j+1,i). */
b_ref(*n + 1, *n) = *wi;
i__1 = *n - 1;
for (j = 1; j <= i__1; ++j) {
b_ref(*n + 1, j) = 0.f;
/* L180: */
}
for (j = *n; j >= 2; --j) {
ej = h___ref(j, j - 1);
absbjj = slapy2_(&b_ref(j, j), &b_ref(j + 1, j));
if (absbjj < dabs(ej)) {
/* Interchange columns and eliminate */
xr = b_ref(j, j) / ej;
xi = b_ref(j + 1, j) / ej;
b_ref(j, j) = ej;
b_ref(j + 1, j) = 0.f;
i__1 = j - 1;
for (i__ = 1; i__ <= i__1; ++i__) {
temp = b_ref(i__, j - 1);
b_ref(i__, j - 1) = b_ref(i__, j) - xr * temp;
b_ref(j, i__) = b_ref(j + 1, i__) - xi * temp;
b_ref(i__, j) = temp;
b_ref(j + 1, i__) = 0.f;
/* L190: */
}
b_ref(j + 1, j - 1) = *wi;
b_ref(j - 1, j - 1) = b_ref(j - 1, j - 1) + xi * *wi;
b_ref(j, j - 1) = b_ref(j, j - 1) - xr * *wi;
/* ** */
opst += (j - 1 << 2) + 6;
/* ** */
} else {
/* Eliminate without interchange. */
if (absbjj == 0.f) {
b_ref(j, j) = *eps3;
b_ref(j + 1, j) = 0.f;
absbjj = *eps3;
}
ej = ej / absbjj / absbjj;
xr = b_ref(j, j) * ej;
xi = -b_ref(j + 1, j) * ej;
i__1 = j - 1;
for (i__ = 1; i__ <= i__1; ++i__) {
b_ref(i__, j - 1) = b_ref(i__, j - 1) - xr * b_ref(
i__, j) + xi * b_ref(j + 1, i__);
b_ref(j, i__) = -xr * b_ref(j + 1, i__) - xi * b_ref(
i__, j);
/* L200: */
}
b_ref(j, j - 1) = b_ref(j, j - 1) + *wi;
/* ** */
opst += (j - 1) * 7 + 4;
/* ** */
}
/* Compute 1-norm of offdiagonal elements of j-th column. */
i__1 = j - 1;
i__2 = j - 1;
work[j] = sasum_(&i__1, &b_ref(1, j), &c__1) + sasum_(&i__2, &
b_ref(j + 1, 1), ldb);
/* ** */
opst += (j - 1 << 1) + 4;
/* **
L210: */
}
if (b_ref(1, 1) == 0.f && b_ref(2, 1) == 0.f) {
b_ref(1, 1) = *eps3;
}
work[1] = 0.f;
i1 = 1;
i2 = *n;
i3 = 1;
}
i__1 = *n;
for (its = 1; its <= i__1; ++its) {
scale = 1.f;
vmax = 1.f;
vcrit = *bignum;
/* Solve U*(xr,xi) = scale*(vr,vi) for a right eigenvector,
or U'*(xr,xi) = scale*(vr,vi) for a left eigenvector,
overwriting (xr,xi) on (vr,vi). */
i__2 = i2;
i__3 = i3;
for (i__ = i1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3)
{
if (work[i__] > vcrit) {
rec = 1.f / vmax;
sscal_(n, &rec, &vr[1], &c__1);
sscal_(n, &rec, &vi[1], &c__1);
scale *= rec;
vmax = 1.f;
vcrit = *bignum;
}
xr = vr[i__];
xi = vi[i__];
if (*rightv) {
i__4 = *n;
for (j = i__ + 1; j <= i__4; ++j) {
xr = xr - b_ref(i__, j) * vr[j] + b_ref(j + 1, i__) *
vi[j];
xi = xi - b_ref(i__, j) * vi[j] - b_ref(j + 1, i__) *
vr[j];
/* L220: */
}
} else {
i__4 = i__ - 1;
for (j = 1; j <= i__4; ++j) {
xr = xr - b_ref(j, i__) * vr[j] + b_ref(i__ + 1, j) *
vi[j];
xi = xi - b_ref(j, i__) * vi[j] - b_ref(i__ + 1, j) *
vr[j];
/* L230: */
}
}
w = (r__1 = b_ref(i__, i__), dabs(r__1)) + (r__2 = b_ref(i__
+ 1, i__), dabs(r__2));
if (w > *smlnum) {
if (w < 1.f) {
w1 = dabs(xr) + dabs(xi);
if (w1 > w * *bignum) {
rec = 1.f / w1;
sscal_(n, &rec, &vr[1], &c__1);
sscal_(n, &rec, &vi[1], &c__1);
xr = vr[i__];
xi = vi[i__];
scale *= rec;
vmax *= rec;
}
}
/* Divide by diagonal element of B. */
sladiv_(&xr, &xi, &b_ref(i__, i__), &b_ref(i__ + 1, i__),
&vr[i__], &vi[i__]);
/* Computing MAX */
r__3 = (r__1 = vr[i__], dabs(r__1)) + (r__2 = vi[i__],
dabs(r__2));
vmax = dmax(r__3,vmax);
vcrit = *bignum / vmax;
/* ** */
opst += 9;
/* ** */
} else {
i__4 = *n;
for (j = 1; j <= i__4; ++j) {
vr[j] = 0.f;
vi[j] = 0.f;
/* L240: */
}
vr[i__] = 1.f;
vi[i__] = 1.f;
scale = 0.f;
vmax = 1.f;
vcrit = *bignum;
}
/* L250: */
}
/* **
Increment op count for loop 260, assuming no scaling */
latime_1.ops += (*n << 2) * (*n - 1);
/* **
Test for sufficient growth in the norm of (VR,VI). */
vnorm = sasum_(n, &vr[1], &c__1) + sasum_(n, &vi[1], &c__1);
/* ** */
opst += *n << 1;
/* ** */
if (vnorm >= growto * scale) {
goto L280;
}
/* Choose a new orthogonal starting vector and try again. */
y = *eps3 / (rootn + 1.f);
vr[1] = *eps3;
vi[1] = 0.f;
i__3 = *n;
for (i__ = 2; i__ <= i__3; ++i__) {
vr[i__] = y;
vi[i__] = 0.f;
/* L260: */
}
vr[*n - its + 1] -= *eps3 * rootn;
/* ** */
opst += 4;
/* **
L270: */
}
/* Failure to find eigenvector in N iterations */
*info = 1;
L280:
/* Normalize eigenvector. */
vnorm = 0.f;
i__1 = *n;
for (i__ = 1; i__ <= i__1; ++i__) {
/* Computing MAX */
r__3 = vnorm, r__4 = (r__1 = vr[i__], dabs(r__1)) + (r__2 = vi[
i__], dabs(r__2));
vnorm = dmax(r__3,r__4);
/* L290: */
}
r__1 = 1.f / vnorm;
sscal_(n, &r__1, &vr[1], &c__1);
r__1 = 1.f / vnorm;
sscal_(n, &r__1, &vi[1], &c__1);
/* ** */
opst += (*n << 2) + 1;
/* ** */
}
/* **
Compute final op count */
latime_1.ops += opst;
/* ** */
return 0;
/* End of SLAEIN */
} /* slaein_ */
#undef h___ref
#undef b_ref
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -