📄 dlagv2.c
字号:
*snr = 0.;
/*< CALL DROT( 2, A( 1, 1 ), LDA, A( 2, 1 ), LDA, CSL, SNL ) >*/
drot_(&c__2, &a[a_dim1 + 1], lda, &a[a_dim1 + 2], lda, csl, snl);
/*< CALL DROT( 2, B( 1, 1 ), LDB, B( 2, 1 ), LDB, CSL, SNL ) >*/
drot_(&c__2, &b[b_dim1 + 1], ldb, &b[b_dim1 + 2], ldb, csl, snl);
/*< A( 2, 1 ) = ZERO >*/
a[a_dim1 + 2] = 0.;
/*< B( 1, 1 ) = ZERO >*/
b[b_dim1 + 1] = 0.;
/*< B( 2, 1 ) = ZERO >*/
b[b_dim1 + 2] = 0.;
/*< ELSE IF( ABS( B( 2, 2 ) ).LE.ULP ) THEN >*/
} else if ((d__1 = b[(b_dim1 << 1) + 2], abs(d__1)) <= ulp) {
/*< CALL DLARTG( A( 2, 2 ), A( 2, 1 ), CSR, SNR, T ) >*/
dlartg_(&a[(a_dim1 << 1) + 2], &a[a_dim1 + 2], csr, snr, &t);
/*< SNR = -SNR >*/
*snr = -(*snr);
/*< CALL DROT( 2, A( 1, 1 ), 1, A( 1, 2 ), 1, CSR, SNR ) >*/
drot_(&c__2, &a[a_dim1 + 1], &c__1, &a[(a_dim1 << 1) + 1], &c__1, csr,
snr);
/*< CALL DROT( 2, B( 1, 1 ), 1, B( 1, 2 ), 1, CSR, SNR ) >*/
drot_(&c__2, &b[b_dim1 + 1], &c__1, &b[(b_dim1 << 1) + 1], &c__1, csr,
snr);
/*< CSL = ONE >*/
*csl = 1.;
/*< SNL = ZERO >*/
*snl = 0.;
/*< A( 2, 1 ) = ZERO >*/
a[a_dim1 + 2] = 0.;
/*< B( 2, 1 ) = ZERO >*/
b[b_dim1 + 2] = 0.;
/*< B( 2, 2 ) = ZERO >*/
b[(b_dim1 << 1) + 2] = 0.;
/*< ELSE >*/
} else {
/* B is nonsingular, first compute the eigenvalues of (A,B) */
/*< >*/
dlag2_(&a[a_offset], lda, &b[b_offset], ldb, &safmin, &scale1, &
scale2, &wr1, &wr2, &wi);
/*< IF( WI.EQ.ZERO ) THEN >*/
if (wi == 0.) {
/* two real eigenvalues, compute s*A-w*B */
/*< H1 = SCALE1*A( 1, 1 ) - WR1*B( 1, 1 ) >*/
h1 = scale1 * a[a_dim1 + 1] - wr1 * b[b_dim1 + 1];
/*< H2 = SCALE1*A( 1, 2 ) - WR1*B( 1, 2 ) >*/
h2 = scale1 * a[(a_dim1 << 1) + 1] - wr1 * b[(b_dim1 << 1) + 1];
/*< H3 = SCALE1*A( 2, 2 ) - WR1*B( 2, 2 ) >*/
h3 = scale1 * a[(a_dim1 << 1) + 2] - wr1 * b[(b_dim1 << 1) + 2];
/*< RR = DLAPY2( H1, H2 ) >*/
rr = dlapy2_(&h1, &h2);
/*< QQ = DLAPY2( SCALE1*A( 2, 1 ), H3 ) >*/
d__1 = scale1 * a[a_dim1 + 2];
qq = dlapy2_(&d__1, &h3);
/*< IF( RR.GT.QQ ) THEN >*/
if (rr > qq) {
/* find right rotation matrix to zero 1,1 element of */
/* (sA - wB) */
/*< CALL DLARTG( H2, H1, CSR, SNR, T ) >*/
dlartg_(&h2, &h1, csr, snr, &t);
/*< ELSE >*/
} else {
/* find right rotation matrix to zero 2,1 element of */
/* (sA - wB) */
/*< CALL DLARTG( H3, SCALE1*A( 2, 1 ), CSR, SNR, T ) >*/
d__1 = scale1 * a[a_dim1 + 2];
dlartg_(&h3, &d__1, csr, snr, &t);
/*< END IF >*/
}
/*< SNR = -SNR >*/
*snr = -(*snr);
/*< CALL DROT( 2, A( 1, 1 ), 1, A( 1, 2 ), 1, CSR, SNR ) >*/
drot_(&c__2, &a[a_dim1 + 1], &c__1, &a[(a_dim1 << 1) + 1], &c__1,
csr, snr);
/*< CALL DROT( 2, B( 1, 1 ), 1, B( 1, 2 ), 1, CSR, SNR ) >*/
drot_(&c__2, &b[b_dim1 + 1], &c__1, &b[(b_dim1 << 1) + 1], &c__1,
csr, snr);
/* compute inf norms of A and B */
/*< >*/
/* Computing MAX */
d__5 = (d__1 = a[a_dim1 + 1], abs(d__1)) + (d__2 = a[(a_dim1 << 1)
+ 1], abs(d__2)), d__6 = (d__3 = a[a_dim1 + 2], abs(d__3)
) + (d__4 = a[(a_dim1 << 1) + 2], abs(d__4));
h1 = max(d__5,d__6);
/*< >*/
/* Computing MAX */
d__5 = (d__1 = b[b_dim1 + 1], abs(d__1)) + (d__2 = b[(b_dim1 << 1)
+ 1], abs(d__2)), d__6 = (d__3 = b[b_dim1 + 2], abs(d__3)
) + (d__4 = b[(b_dim1 << 1) + 2], abs(d__4));
h2 = max(d__5,d__6);
/*< IF( ( SCALE1*H1 ).GE.ABS( WR1 )*H2 ) THEN >*/
if (scale1 * h1 >= abs(wr1) * h2) {
/* find left rotation matrix Q to zero out B(2,1) */
/*< CALL DLARTG( B( 1, 1 ), B( 2, 1 ), CSL, SNL, R ) >*/
dlartg_(&b[b_dim1 + 1], &b[b_dim1 + 2], csl, snl, &r__);
/*< ELSE >*/
} else {
/* find left rotation matrix Q to zero out A(2,1) */
/*< CALL DLARTG( A( 1, 1 ), A( 2, 1 ), CSL, SNL, R ) >*/
dlartg_(&a[a_dim1 + 1], &a[a_dim1 + 2], csl, snl, &r__);
/*< END IF >*/
}
/*< CALL DROT( 2, A( 1, 1 ), LDA, A( 2, 1 ), LDA, CSL, SNL ) >*/
drot_(&c__2, &a[a_dim1 + 1], lda, &a[a_dim1 + 2], lda, csl, snl);
/*< CALL DROT( 2, B( 1, 1 ), LDB, B( 2, 1 ), LDB, CSL, SNL ) >*/
drot_(&c__2, &b[b_dim1 + 1], ldb, &b[b_dim1 + 2], ldb, csl, snl);
/*< A( 2, 1 ) = ZERO >*/
a[a_dim1 + 2] = 0.;
/*< B( 2, 1 ) = ZERO >*/
b[b_dim1 + 2] = 0.;
/*< ELSE >*/
} else {
/* a pair of complex conjugate eigenvalues */
/* first compute the SVD of the matrix B */
/*< >*/
dlasv2_(&b[b_dim1 + 1], &b[(b_dim1 << 1) + 1], &b[(b_dim1 << 1) +
2], &r__, &t, snr, csr, snl, csl);
/* Form (A,B) := Q(A,B)Z' where Q is left rotation matrix and */
/* Z is right rotation matrix computed from DLASV2 */
/*< CALL DROT( 2, A( 1, 1 ), LDA, A( 2, 1 ), LDA, CSL, SNL ) >*/
drot_(&c__2, &a[a_dim1 + 1], lda, &a[a_dim1 + 2], lda, csl, snl);
/*< CALL DROT( 2, B( 1, 1 ), LDB, B( 2, 1 ), LDB, CSL, SNL ) >*/
drot_(&c__2, &b[b_dim1 + 1], ldb, &b[b_dim1 + 2], ldb, csl, snl);
/*< CALL DROT( 2, A( 1, 1 ), 1, A( 1, 2 ), 1, CSR, SNR ) >*/
drot_(&c__2, &a[a_dim1 + 1], &c__1, &a[(a_dim1 << 1) + 1], &c__1,
csr, snr);
/*< CALL DROT( 2, B( 1, 1 ), 1, B( 1, 2 ), 1, CSR, SNR ) >*/
drot_(&c__2, &b[b_dim1 + 1], &c__1, &b[(b_dim1 << 1) + 1], &c__1,
csr, snr);
/*< B( 2, 1 ) = ZERO >*/
b[b_dim1 + 2] = 0.;
/*< B( 1, 2 ) = ZERO >*/
b[(b_dim1 << 1) + 1] = 0.;
/*< END IF >*/
}
/*< END IF >*/
}
/* Unscaling */
/*< A( 1, 1 ) = ANORM*A( 1, 1 ) >*/
a[a_dim1 + 1] = anorm * a[a_dim1 + 1];
/*< A( 2, 1 ) = ANORM*A( 2, 1 ) >*/
a[a_dim1 + 2] = anorm * a[a_dim1 + 2];
/*< A( 1, 2 ) = ANORM*A( 1, 2 ) >*/
a[(a_dim1 << 1) + 1] = anorm * a[(a_dim1 << 1) + 1];
/*< A( 2, 2 ) = ANORM*A( 2, 2 ) >*/
a[(a_dim1 << 1) + 2] = anorm * a[(a_dim1 << 1) + 2];
/*< B( 1, 1 ) = BNORM*B( 1, 1 ) >*/
b[b_dim1 + 1] = bnorm * b[b_dim1 + 1];
/*< B( 2, 1 ) = BNORM*B( 2, 1 ) >*/
b[b_dim1 + 2] = bnorm * b[b_dim1 + 2];
/*< B( 1, 2 ) = BNORM*B( 1, 2 ) >*/
b[(b_dim1 << 1) + 1] = bnorm * b[(b_dim1 << 1) + 1];
/*< B( 2, 2 ) = BNORM*B( 2, 2 ) >*/
b[(b_dim1 << 1) + 2] = bnorm * b[(b_dim1 << 1) + 2];
/*< IF( WI.EQ.ZERO ) THEN >*/
if (wi == 0.) {
/*< ALPHAR( 1 ) = A( 1, 1 ) >*/
alphar[1] = a[a_dim1 + 1];
/*< ALPHAR( 2 ) = A( 2, 2 ) >*/
alphar[2] = a[(a_dim1 << 1) + 2];
/*< ALPHAI( 1 ) = ZERO >*/
alphai[1] = 0.;
/*< ALPHAI( 2 ) = ZERO >*/
alphai[2] = 0.;
/*< BETA( 1 ) = B( 1, 1 ) >*/
beta[1] = b[b_dim1 + 1];
/*< BETA( 2 ) = B( 2, 2 ) >*/
beta[2] = b[(b_dim1 << 1) + 2];
/*< ELSE >*/
} else {
/*< ALPHAR( 1 ) = ANORM*WR1 / SCALE1 / BNORM >*/
alphar[1] = anorm * wr1 / scale1 / bnorm;
/*< ALPHAI( 1 ) = ANORM*WI / SCALE1 / BNORM >*/
alphai[1] = anorm * wi / scale1 / bnorm;
/*< ALPHAR( 2 ) = ALPHAR( 1 ) >*/
alphar[2] = alphar[1];
/*< ALPHAI( 2 ) = -ALPHAI( 1 ) >*/
alphai[2] = -alphai[1];
/*< BETA( 1 ) = ONE >*/
beta[1] = 1.;
/*< BETA( 2 ) = ONE >*/
beta[2] = 1.;
/*< END IF >*/
}
/*< 10 CONTINUE >*/
/* L10: */
/*< RETURN >*/
return 0;
/* End of DLAGV2 */
/*< END >*/
} /* dlagv2_ */
#ifdef __cplusplus
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -