📄 ztgevc.c
字号:
/* ------------------- Begin Timing Code ------------------- */
latime_1.ops += (doublereal) ((*n - je) * 36 + (*n - je << 3)
* (*n + 1 - je) + (*n + 1 - ibeg) * 3 + 1) + (
doublereal) iopst;
/* -------------------- End Timing Code -------------------- */
}
L140:
;
}
}
/* Right eigenvectors */
if (compr) {
ieig = im + 1;
/* Main loop over eigenvalues */
for (je = *n; je >= 1; --je) {
if (ilall) {
ilcomp = TRUE_;
} else {
ilcomp = select[je];
}
if (ilcomp) {
--ieig;
i__1 = a_subscr(je, je);
i__2 = b_subscr(je, je);
if ((d__2 = a[i__1].r, abs(d__2)) + (d__3 = d_imag(&a_ref(je,
je)), abs(d__3)) <= safmin && (d__1 = b[i__2].r, abs(
d__1)) <= safmin) {
/* Singular matrix pencil -- return unit eigenvector */
i__1 = *n;
for (jr = 1; jr <= i__1; ++jr) {
i__2 = vr_subscr(jr, ieig);
vr[i__2].r = 0., vr[i__2].i = 0.;
/* L150: */
}
i__1 = vr_subscr(ieig, ieig);
vr[i__1].r = 1., vr[i__1].i = 0.;
goto L250;
}
/* Non-singular eigenvalue:
Compute coefficients a and b in
( a A - b B ) x = 0
Computing MAX */
i__1 = a_subscr(je, je);
i__2 = b_subscr(je, je);
d__4 = ((d__2 = a[i__1].r, abs(d__2)) + (d__3 = d_imag(&a_ref(
je, je)), abs(d__3))) * ascale, d__5 = (d__1 = b[i__2]
.r, abs(d__1)) * bscale, d__4 = max(d__4,d__5);
temp = 1. / max(d__4,safmin);
i__1 = a_subscr(je, je);
z__2.r = temp * a[i__1].r, z__2.i = temp * a[i__1].i;
z__1.r = ascale * z__2.r, z__1.i = ascale * z__2.i;
salpha.r = z__1.r, salpha.i = z__1.i;
i__1 = b_subscr(je, je);
sbeta = temp * b[i__1].r * bscale;
acoeff = sbeta * ascale;
z__1.r = bscale * salpha.r, z__1.i = bscale * salpha.i;
bcoeff.r = z__1.r, bcoeff.i = z__1.i;
/* Scale to avoid underflow */
lsa = abs(sbeta) >= safmin && abs(acoeff) < small;
lsb = (d__1 = salpha.r, abs(d__1)) + (d__2 = d_imag(&salpha),
abs(d__2)) >= safmin && (d__3 = bcoeff.r, abs(d__3))
+ (d__4 = d_imag(&bcoeff), abs(d__4)) < small;
scale = 1.;
if (lsa) {
scale = small / abs(sbeta) * min(anorm,big);
}
if (lsb) {
/* Computing MAX */
d__3 = scale, d__4 = small / ((d__1 = salpha.r, abs(d__1))
+ (d__2 = d_imag(&salpha), abs(d__2))) * min(
bnorm,big);
scale = max(d__3,d__4);
}
if (lsa || lsb) {
/* Computing MIN
Computing MAX */
d__5 = 1., d__6 = abs(acoeff), d__5 = max(d__5,d__6),
d__6 = (d__1 = bcoeff.r, abs(d__1)) + (d__2 =
d_imag(&bcoeff), abs(d__2));
d__3 = scale, d__4 = 1. / (safmin * max(d__5,d__6));
scale = min(d__3,d__4);
if (lsa) {
acoeff = ascale * (scale * sbeta);
} else {
acoeff = scale * acoeff;
}
if (lsb) {
z__2.r = scale * salpha.r, z__2.i = scale * salpha.i;
z__1.r = bscale * z__2.r, z__1.i = bscale * z__2.i;
bcoeff.r = z__1.r, bcoeff.i = z__1.i;
} else {
z__1.r = scale * bcoeff.r, z__1.i = scale * bcoeff.i;
bcoeff.r = z__1.r, bcoeff.i = z__1.i;
}
/* ----------------- Begin Timing Code ------------------
Calculation of SALPHA through DMIN */
iopst = 34;
} else {
iopst = 20;
/* ------------------ End Timing Code ------------------- */
}
acoefa = abs(acoeff);
bcoefa = (d__1 = bcoeff.r, abs(d__1)) + (d__2 = d_imag(&
bcoeff), abs(d__2));
xmax = 1.;
i__1 = *n;
for (jr = 1; jr <= i__1; ++jr) {
i__2 = jr;
work[i__2].r = 0., work[i__2].i = 0.;
/* L160: */
}
i__1 = je;
work[i__1].r = 1., work[i__1].i = 0.;
/* Computing MAX */
d__1 = ulp * acoefa * anorm, d__2 = ulp * bcoefa * bnorm,
d__1 = max(d__1,d__2);
dmin__ = max(d__1,safmin);
/* Triangular solve of (a A - b B) x = 0 (columnwise)
WORK(1:j-1) contains sums w,
WORK(j+1:JE) contains x */
i__1 = je - 1;
for (jr = 1; jr <= i__1; ++jr) {
i__2 = jr;
i__3 = a_subscr(jr, je);
z__2.r = acoeff * a[i__3].r, z__2.i = acoeff * a[i__3].i;
i__4 = b_subscr(jr, je);
z__3.r = bcoeff.r * b[i__4].r - bcoeff.i * b[i__4].i,
z__3.i = bcoeff.r * b[i__4].i + bcoeff.i * b[i__4]
.r;
z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i;
work[i__2].r = z__1.r, work[i__2].i = z__1.i;
/* L170: */
}
i__1 = je;
work[i__1].r = 1., work[i__1].i = 0.;
for (j = je - 1; j >= 1; --j) {
/* Form x(j) := - w(j) / d
with scaling and perturbation of the denominator */
i__1 = a_subscr(j, j);
z__2.r = acoeff * a[i__1].r, z__2.i = acoeff * a[i__1].i;
i__2 = b_subscr(j, j);
z__3.r = bcoeff.r * b[i__2].r - bcoeff.i * b[i__2].i,
z__3.i = bcoeff.r * b[i__2].i + bcoeff.i * b[i__2]
.r;
z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i;
d__.r = z__1.r, d__.i = z__1.i;
if ((d__1 = d__.r, abs(d__1)) + (d__2 = d_imag(&d__), abs(
d__2)) <= dmin__) {
z__1.r = dmin__, z__1.i = 0.;
d__.r = z__1.r, d__.i = z__1.i;
}
if ((d__1 = d__.r, abs(d__1)) + (d__2 = d_imag(&d__), abs(
d__2)) < 1.) {
i__1 = j;
if ((d__1 = work[i__1].r, abs(d__1)) + (d__2 = d_imag(
&work[j]), abs(d__2)) >= bignum * ((d__3 =
d__.r, abs(d__3)) + (d__4 = d_imag(&d__), abs(
d__4)))) {
i__1 = j;
temp = 1. / ((d__1 = work[i__1].r, abs(d__1)) + (
d__2 = d_imag(&work[j]), abs(d__2)));
i__1 = je;
for (jr = 1; jr <= i__1; ++jr) {
i__2 = jr;
i__3 = jr;
z__1.r = temp * work[i__3].r, z__1.i = temp *
work[i__3].i;
work[i__2].r = z__1.r, work[i__2].i = z__1.i;
/* L180: */
}
/* -------------- Begin Timing Code --------------- */
iopst = iopst + (je << 1) + 5;
} else {
iopst += 3;
/* --------------- End Timing Code ---------------- */
}
}
i__1 = j;
i__2 = j;
z__2.r = -work[i__2].r, z__2.i = -work[i__2].i;
zladiv_(&z__1, &z__2, &d__);
work[i__1].r = z__1.r, work[i__1].i = z__1.i;
if (j > 1) {
/* w = w + x(j)*(a A(*,j) - b B(*,j) ) with scaling */
i__1 = j;
if ((d__1 = work[i__1].r, abs(d__1)) + (d__2 = d_imag(
&work[j]), abs(d__2)) > 1.) {
i__1 = j;
temp = 1. / ((d__1 = work[i__1].r, abs(d__1)) + (
d__2 = d_imag(&work[j]), abs(d__2)));
if (acoefa * rwork[j] + bcoefa * rwork[*n + j] >=
bignum * temp) {
i__1 = je;
for (jr = 1; jr <= i__1; ++jr) {
i__2 = jr;
i__3 = jr;
z__1.r = temp * work[i__3].r, z__1.i =
temp * work[i__3].i;
work[i__2].r = z__1.r, work[i__2].i =
z__1.i;
/* L190: */
}
/* ------------- Begin Timing Code ------------- */
iopst = iopst + (je << 1) + 6;
} else {
iopst += 6;
/* -------------- End Timing Code -------------- */
}
}
i__1 = j;
z__1.r = acoeff * work[i__1].r, z__1.i = acoeff *
work[i__1].i;
ca.r = z__1.r, ca.i = z__1.i;
i__1 = j;
z__1.r = bcoeff.r * work[i__1].r - bcoeff.i * work[
i__1].i, z__1.i = bcoeff.r * work[i__1].i +
bcoeff.i * work[i__1].r;
cb.r = z__1.r, cb.i = z__1.i;
i__1 = j - 1;
for (jr = 1; jr <= i__1; ++jr) {
i__2 = jr;
i__3 = jr;
i__4 = a_subscr(jr, j);
z__3.r = ca.r * a[i__4].r - ca.i * a[i__4].i,
z__3.i = ca.r * a[i__4].i + ca.i * a[i__4]
.r;
z__2.r = work[i__3].r + z__3.r, z__2.i = work[
i__3].i + z__3.i;
i__5 = b_subscr(jr, j);
z__4.r = cb.r * b[i__5].r - cb.i * b[i__5].i,
z__4.i = cb.r * b[i__5].i + cb.i * b[i__5]
.r;
z__1.r = z__2.r - z__4.r, z__1.i = z__2.i -
z__4.i;
work[i__2].r = z__1.r, work[i__2].i = z__1.i;
/* L200: */
}
}
/* L210: */
}
/* Back transform eigenvector if HOWMNY='B'. */
if (ilback) {
zgemv_("N", n, &je, &c_b2, &vr[vr_offset], ldvr, &work[1],
&c__1, &c_b1, &work[*n + 1], &c__1);
isrc = 2;
iend = *n;
/* ----------------- Begin Timing Code ------------------ */
iopst += (*n << 3) * je;
/* ------------------ End Timing Code ------------------- */
} else {
isrc = 1;
iend = je;
}
/* Copy and scale eigenvector into column of VR */
xmax = 0.;
i__1 = iend;
for (jr = 1; jr <= i__1; ++jr) {
/* Computing MAX */
i__2 = (isrc - 1) * *n + jr;
d__3 = xmax, d__4 = (d__1 = work[i__2].r, abs(d__1)) + (
d__2 = d_imag(&work[(isrc - 1) * *n + jr]), abs(
d__2));
xmax = max(d__3,d__4);
/* L220: */
}
if (xmax > safmin) {
temp = 1. / xmax;
i__1 = iend;
for (jr = 1; jr <= i__1; ++jr) {
i__2 = vr_subscr(jr, ieig);
i__3 = (isrc - 1) * *n + jr;
z__1.r = temp * work[i__3].r, z__1.i = temp * work[
i__3].i;
vr[i__2].r = z__1.r, vr[i__2].i = z__1.i;
/* L230: */
}
} else {
iend = 0;
}
i__1 = *n;
for (jr = iend + 1; jr <= i__1; ++jr) {
i__2 = vr_subscr(jr, ieig);
vr[i__2].r = 0., vr[i__2].i = 0.;
/* L240: */
}
/* ------------------- Begin Timing Code ------------------- */
latime_1.ops += (doublereal) ((je - 2) * 30 + (je - 1 << 3) *
(je - 2) + iend * 3 + 22) + (doublereal) iopst;
/* -------------------- End Timing Code -------------------- */
}
L250:
;
}
}
return 0;
/* End of ZTGEVC */
} /* ztgevc_ */
#undef vr_ref
#undef vr_subscr
#undef vl_ref
#undef vl_subscr
#undef b_ref
#undef b_subscr
#undef a_ref
#undef a_subscr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -