📄 ctgevc.c
字号:
safmin = slamch_("Safe minimum");
big = 1.f / safmin;
slabad_(&safmin, &big);
ulp = slamch_("Epsilon") * slamch_("Base");
small = safmin * *n / ulp;
big = 1.f / small;
bignum = 1.f / (safmin * *n);
/* Compute the 1-norm of each column of the strictly upper triangular
part of A and B to check for possible overflow in the triangular
solver. */
i__1 = a_subscr(1, 1);
anorm = (r__1 = a[i__1].r, dabs(r__1)) + (r__2 = r_imag(&a_ref(1, 1)),
dabs(r__2));
i__1 = b_subscr(1, 1);
bnorm = (r__1 = b[i__1].r, dabs(r__1)) + (r__2 = r_imag(&b_ref(1, 1)),
dabs(r__2));
rwork[1] = 0.f;
rwork[*n + 1] = 0.f;
i__1 = *n;
for (j = 2; j <= i__1; ++j) {
rwork[j] = 0.f;
rwork[*n + j] = 0.f;
i__2 = j - 1;
for (i__ = 1; i__ <= i__2; ++i__) {
i__3 = a_subscr(i__, j);
rwork[j] += (r__1 = a[i__3].r, dabs(r__1)) + (r__2 = r_imag(&
a_ref(i__, j)), dabs(r__2));
i__3 = b_subscr(i__, j);
rwork[*n + j] += (r__1 = b[i__3].r, dabs(r__1)) + (r__2 = r_imag(&
b_ref(i__, j)), dabs(r__2));
/* L30: */
}
/* Computing MAX */
i__2 = a_subscr(j, j);
r__3 = anorm, r__4 = rwork[j] + ((r__1 = a[i__2].r, dabs(r__1)) + (
r__2 = r_imag(&a_ref(j, j)), dabs(r__2)));
anorm = dmax(r__3,r__4);
/* Computing MAX */
i__2 = b_subscr(j, j);
r__3 = bnorm, r__4 = rwork[*n + j] + ((r__1 = b[i__2].r, dabs(r__1))
+ (r__2 = r_imag(&b_ref(j, j)), dabs(r__2)));
bnorm = dmax(r__3,r__4);
/* L40: */
}
ascale = 1.f / dmax(anorm,safmin);
bscale = 1.f / dmax(bnorm,safmin);
/* ---------------------- Begin Timing Code -------------------------
Computing 2nd power */
i__1 = *n;
latime_1.ops += (real) ((i__1 * i__1 << 1) + (*n << 1) + 6);
/* ----------------------- End Timing Code --------------------------
Left eigenvectors */
if (compl) {
ieig = 0;
/* Main loop over eigenvalues */
i__1 = *n;
for (je = 1; je <= i__1; ++je) {
if (ilall) {
ilcomp = TRUE_;
} else {
ilcomp = select[je];
}
if (ilcomp) {
++ieig;
i__2 = a_subscr(je, je);
i__3 = b_subscr(je, je);
if ((r__2 = a[i__2].r, dabs(r__2)) + (r__3 = r_imag(&a_ref(je,
je)), dabs(r__3)) <= safmin && (r__1 = b[i__3].r,
dabs(r__1)) <= safmin) {
/* Singular matrix pencil -- return unit eigenvector */
i__2 = *n;
for (jr = 1; jr <= i__2; ++jr) {
i__3 = vl_subscr(jr, ieig);
vl[i__3].r = 0.f, vl[i__3].i = 0.f;
/* L50: */
}
i__2 = vl_subscr(ieig, ieig);
vl[i__2].r = 1.f, vl[i__2].i = 0.f;
goto L140;
}
/* Non-singular eigenvalue:
Compute coefficients a and b in
H
y ( a A - b B ) = 0
Computing MAX */
i__2 = a_subscr(je, je);
i__3 = b_subscr(je, je);
r__4 = ((r__2 = a[i__2].r, dabs(r__2)) + (r__3 = r_imag(&
a_ref(je, je)), dabs(r__3))) * ascale, r__5 = (r__1 =
b[i__3].r, dabs(r__1)) * bscale, r__4 = max(r__4,r__5)
;
temp = 1.f / dmax(r__4,safmin);
i__2 = a_subscr(je, je);
q__2.r = temp * a[i__2].r, q__2.i = temp * a[i__2].i;
q__1.r = ascale * q__2.r, q__1.i = ascale * q__2.i;
salpha.r = q__1.r, salpha.i = q__1.i;
i__2 = b_subscr(je, je);
sbeta = temp * b[i__2].r * bscale;
acoeff = sbeta * ascale;
q__1.r = bscale * salpha.r, q__1.i = bscale * salpha.i;
bcoeff.r = q__1.r, bcoeff.i = q__1.i;
/* Scale to avoid underflow */
lsa = dabs(sbeta) >= safmin && dabs(acoeff) < small;
lsb = (r__1 = salpha.r, dabs(r__1)) + (r__2 = r_imag(&salpha),
dabs(r__2)) >= safmin && (r__3 = bcoeff.r, dabs(r__3)
) + (r__4 = r_imag(&bcoeff), dabs(r__4)) < small;
scale = 1.f;
if (lsa) {
scale = small / dabs(sbeta) * dmin(anorm,big);
}
if (lsb) {
/* Computing MAX */
r__3 = scale, r__4 = small / ((r__1 = salpha.r, dabs(r__1)
) + (r__2 = r_imag(&salpha), dabs(r__2))) * dmin(
bnorm,big);
scale = dmax(r__3,r__4);
}
if (lsa || lsb) {
/* Computing MIN
Computing MAX */
r__5 = 1.f, r__6 = dabs(acoeff), r__5 = max(r__5,r__6),
r__6 = (r__1 = bcoeff.r, dabs(r__1)) + (r__2 =
r_imag(&bcoeff), dabs(r__2));
r__3 = scale, r__4 = 1.f / (safmin * dmax(r__5,r__6));
scale = dmin(r__3,r__4);
if (lsa) {
acoeff = ascale * (scale * sbeta);
} else {
acoeff = scale * acoeff;
}
if (lsb) {
q__2.r = scale * salpha.r, q__2.i = scale * salpha.i;
q__1.r = bscale * q__2.r, q__1.i = bscale * q__2.i;
bcoeff.r = q__1.r, bcoeff.i = q__1.i;
} else {
q__1.r = scale * bcoeff.r, q__1.i = scale * bcoeff.i;
bcoeff.r = q__1.r, bcoeff.i = q__1.i;
}
/* ----------------- Begin Timing Code ------------------
Calculation of SALPHA through DMIN */
iopst = 34;
} else {
iopst = 20;
/* ------------------ End Timing Code ------------------- */
}
acoefa = dabs(acoeff);
bcoefa = (r__1 = bcoeff.r, dabs(r__1)) + (r__2 = r_imag(&
bcoeff), dabs(r__2));
xmax = 1.f;
i__2 = *n;
for (jr = 1; jr <= i__2; ++jr) {
i__3 = jr;
work[i__3].r = 0.f, work[i__3].i = 0.f;
/* L60: */
}
i__2 = je;
work[i__2].r = 1.f, work[i__2].i = 0.f;
/* Computing MAX */
r__1 = ulp * acoefa * anorm, r__2 = ulp * bcoefa * bnorm,
r__1 = max(r__1,r__2);
dmin__ = dmax(r__1,safmin);
/* H
Triangular solve of (a A - b B) y = 0
H
(rowwise in (a A - b B) , or columnwise in a A - b B) */
i__2 = *n;
for (j = je + 1; j <= i__2; ++j) {
/* Compute
j-1
SUM = sum conjg( a*A(k,j) - b*B(k,j) )*x(k)
k=je
(Scale if necessary) */
temp = 1.f / xmax;
if (acoefa * rwork[j] + bcoefa * rwork[*n + j] > bignum *
temp) {
i__3 = j - 1;
for (jr = je; jr <= i__3; ++jr) {
i__4 = jr;
i__5 = jr;
q__1.r = temp * work[i__5].r, q__1.i = temp *
work[i__5].i;
work[i__4].r = q__1.r, work[i__4].i = q__1.i;
/* L70: */
}
xmax = 1.f;
/* ---------------- Begin Timing Code ---------------- */
iopst += j - je << 1;
/* ----------------- End Timing Code ----------------- */
}
suma.r = 0.f, suma.i = 0.f;
sumb.r = 0.f, sumb.i = 0.f;
i__3 = j - 1;
for (jr = je; jr <= i__3; ++jr) {
r_cnjg(&q__3, &a_ref(jr, j));
i__4 = jr;
q__2.r = q__3.r * work[i__4].r - q__3.i * work[i__4]
.i, q__2.i = q__3.r * work[i__4].i + q__3.i *
work[i__4].r;
q__1.r = suma.r + q__2.r, q__1.i = suma.i + q__2.i;
suma.r = q__1.r, suma.i = q__1.i;
r_cnjg(&q__3, &b_ref(jr, j));
i__4 = jr;
q__2.r = q__3.r * work[i__4].r - q__3.i * work[i__4]
.i, q__2.i = q__3.r * work[i__4].i + q__3.i *
work[i__4].r;
q__1.r = sumb.r + q__2.r, q__1.i = sumb.i + q__2.i;
sumb.r = q__1.r, sumb.i = q__1.i;
/* L80: */
}
q__2.r = acoeff * suma.r, q__2.i = acoeff * suma.i;
r_cnjg(&q__4, &bcoeff);
q__3.r = q__4.r * sumb.r - q__4.i * sumb.i, q__3.i =
q__4.r * sumb.i + q__4.i * sumb.r;
q__1.r = q__2.r - q__3.r, q__1.i = q__2.i - q__3.i;
sum.r = q__1.r, sum.i = q__1.i;
/* Form x(j) = - SUM / conjg( a*A(j,j) - b*B(j,j) )
with scaling and perturbation of the denominator */
i__3 = a_subscr(j, j);
q__3.r = acoeff * a[i__3].r, q__3.i = acoeff * a[i__3].i;
i__4 = b_subscr(j, j);
q__4.r = bcoeff.r * b[i__4].r - bcoeff.i * b[i__4].i,
q__4.i = bcoeff.r * b[i__4].i + bcoeff.i * b[i__4]
.r;
q__2.r = q__3.r - q__4.r, q__2.i = q__3.i - q__4.i;
r_cnjg(&q__1, &q__2);
d__.r = q__1.r, d__.i = q__1.i;
if ((r__1 = d__.r, dabs(r__1)) + (r__2 = r_imag(&d__),
dabs(r__2)) <= dmin__) {
q__1.r = dmin__, q__1.i = 0.f;
d__.r = q__1.r, d__.i = q__1.i;
}
if ((r__1 = d__.r, dabs(r__1)) + (r__2 = r_imag(&d__),
dabs(r__2)) < 1.f) {
if ((r__1 = sum.r, dabs(r__1)) + (r__2 = r_imag(&sum),
dabs(r__2)) >= bignum * ((r__3 = d__.r, dabs(
r__3)) + (r__4 = r_imag(&d__), dabs(r__4)))) {
temp = 1.f / ((r__1 = sum.r, dabs(r__1)) + (r__2 =
r_imag(&sum), dabs(r__2)));
i__3 = j - 1;
for (jr = je; jr <= i__3; ++jr) {
i__4 = jr;
i__5 = jr;
q__1.r = temp * work[i__5].r, q__1.i = temp *
work[i__5].i;
work[i__4].r = q__1.r, work[i__4].i = q__1.i;
/* L90: */
}
xmax = temp * xmax;
q__1.r = temp * sum.r, q__1.i = temp * sum.i;
sum.r = q__1.r, sum.i = q__1.i;
/* -------------- Begin Timing Code --------------- */
iopst = iopst + (j - je << 1) + 5;
/* --------------- End Timing Code ---------------- */
}
}
i__3 = j;
q__2.r = -sum.r, q__2.i = -sum.i;
cladiv_(&q__1, &q__2, &d__);
work[i__3].r = q__1.r, work[i__3].i = q__1.i;
/* Computing MAX */
i__3 = j;
r__3 = xmax, r__4 = (r__1 = work[i__3].r, dabs(r__1)) + (
r__2 = r_imag(&work[j]), dabs(r__2));
xmax = dmax(r__3,r__4);
/* L100: */
}
/* Back transform eigenvector if HOWMNY='B'. */
if (ilback) {
i__2 = *n + 1 - je;
cgemv_("N", n, &i__2, &c_b2, &vl_ref(1, je), ldvl, &work[
je], &c__1, &c_b1, &work[*n + 1], &c__1);
isrc = 2;
ibeg = 1;
/* ----------------- Begin Timing Code ------------------ */
iopst += (*n << 3) * (*n + 1 - je);
/* ------------------ End Timing Code ------------------- */
} else {
isrc = 1;
ibeg = je;
}
/* Copy and scale eigenvector into column of VL */
xmax = 0.f;
i__2 = *n;
for (jr = ibeg; jr <= i__2; ++jr) {
/* Computing MAX */
i__3 = (isrc - 1) * *n + jr;
r__3 = xmax, r__4 = (r__1 = work[i__3].r, dabs(r__1)) + (
r__2 = r_imag(&work[(isrc - 1) * *n + jr]), dabs(
r__2));
xmax = dmax(r__3,r__4);
/* L110: */
}
if (xmax > safmin) {
temp = 1.f / xmax;
i__2 = *n;
for (jr = ibeg; jr <= i__2; ++jr) {
i__3 = vl_subscr(jr, ieig);
i__4 = (isrc - 1) * *n + jr;
q__1.r = temp * work[i__4].r, q__1.i = temp * work[
i__4].i;
vl[i__3].r = q__1.r, vl[i__3].i = q__1.i;
/* L120: */
}
} else {
ibeg = *n + 1;
}
i__2 = ibeg - 1;
for (jr = 1; jr <= i__2; ++jr) {
i__3 = vl_subscr(jr, ieig);
vl[i__3].r = 0.f, vl[i__3].i = 0.f;
/* L130: */
}
/* ------------------- Begin Timing Code ------------------- */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -