LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ ctgsen()

subroutine ctgsen ( integer ijob,
logical wantq,
logical wantz,
logical, dimension( * ) select,
integer n,
complex, dimension( lda, * ) a,
integer lda,
complex, dimension( ldb, * ) b,
integer ldb,
complex, dimension( * ) alpha,
complex, dimension( * ) beta,
complex, dimension( ldq, * ) q,
integer ldq,
complex, dimension( ldz, * ) z,
integer ldz,
integer m,
real pl,
real pr,
real, dimension( * ) dif,
complex, dimension( * ) work,
integer lwork,
integer, dimension( * ) iwork,
integer liwork,
integer info )

CTGSEN

Download CTGSEN + dependencies [TGZ] [ZIP] [TXT]

Purpose:
!>
!> CTGSEN reorders the generalized Schur decomposition of a complex
!> matrix pair (A, B) (in terms of an unitary equivalence trans-
!> formation Q**H * (A, B) * Z), so that a selected cluster of eigenvalues
!> appears in the leading diagonal blocks of the pair (A,B). The leading
!> columns of Q and Z form unitary bases of the corresponding left and
!> right eigenspaces (deflating subspaces). (A, B) must be in
!> generalized Schur canonical form, that is, A and B are both upper
!> triangular.
!>
!> CTGSEN also computes the generalized eigenvalues
!>
!>          w(j)= ALPHA(j) / BETA(j)
!>
!> of the reordered matrix pair (A, B).
!>
!> Optionally, the routine computes estimates of reciprocal condition
!> numbers for eigenvalues and eigenspaces. These are Difu[(A11,B11),
!> (A22,B22)] and Difl[(A11,B11), (A22,B22)], i.e. the separation(s)
!> between the matrix pairs (A11, B11) and (A22,B22) that correspond to
!> the selected cluster and the eigenvalues outside the cluster, resp.,
!> and norms of  onto left and right eigenspaces w.r.t.
!> the selected cluster in the (1,1)-block.
!>
!> 
Parameters
[in]IJOB
!>          IJOB is INTEGER
!>          Specifies whether condition numbers are required for the
!>          cluster of eigenvalues (PL and PR) or the deflating subspaces
!>          (Difu and Difl):
!>           =0: Only reorder w.r.t. SELECT. No extras.
!>           =1: Reciprocal of norms of  onto left and right
!>               eigenspaces w.r.t. the selected cluster (PL and PR).
!>           =2: Upper bounds on Difu and Difl. F-norm-based estimate
!>               (DIF(1:2)).
!>           =3: Estimate of Difu and Difl. 1-norm-based estimate
!>               (DIF(1:2)).
!>               About 5 times as expensive as IJOB = 2.
!>           =4: Compute PL, PR and DIF (i.e. 0, 1 and 2 above): Economic
!>               version to get it all.
!>           =5: Compute PL, PR and DIF (i.e. 0, 1 and 3 above)
!> 
[in]WANTQ
!>          WANTQ is LOGICAL
!>          .TRUE. : update the left transformation matrix Q;
!>          .FALSE.: do not update Q.
!> 
[in]WANTZ
!>          WANTZ is LOGICAL
!>          .TRUE. : update the right transformation matrix Z;
!>          .FALSE.: do not update Z.
!> 
[in]SELECT
!>          SELECT is LOGICAL array, dimension (N)
!>          SELECT specifies the eigenvalues in the selected cluster. To
!>          select an eigenvalue w(j), SELECT(j) must be set to
!>          .TRUE..
!> 
[in]N
!>          N is INTEGER
!>          The order of the matrices A and B. N >= 0.
!> 
[in,out]A
!>          A is COMPLEX array, dimension(LDA,N)
!>          On entry, the upper triangular matrix A, in generalized
!>          Schur canonical form.
!>          On exit, A is overwritten by the reordered matrix A.
!> 
[in]LDA
!>          LDA is INTEGER
!>          The leading dimension of the array A. LDA >= max(1,N).
!> 
[in,out]B
!>          B is COMPLEX array, dimension(LDB,N)
!>          On entry, the upper triangular matrix B, in generalized
!>          Schur canonical form.
!>          On exit, B is overwritten by the reordered matrix B.
!> 
[in]LDB
!>          LDB is INTEGER
!>          The leading dimension of the array B. LDB >= max(1,N).
!> 
[out]ALPHA
!>          ALPHA is COMPLEX array, dimension (N)
!> 
[out]BETA
!>          BETA is COMPLEX array, dimension (N)
!>
!>          The diagonal elements of A and B, respectively,
!>          when the pair (A,B) has been reduced to generalized Schur
!>          form.  ALPHA(i)/BETA(i) i=1,...,N are the generalized
!>          eigenvalues.
!> 
[in,out]Q
!>          Q is COMPLEX array, dimension (LDQ,N)
!>          On entry, if WANTQ = .TRUE., Q is an N-by-N matrix.
!>          On exit, Q has been postmultiplied by the left unitary
!>          transformation matrix which reorder (A, B); The leading M
!>          columns of Q form orthonormal bases for the specified pair of
!>          left eigenspaces (deflating subspaces).
!>          If WANTQ = .FALSE., Q is not referenced.
!> 
[in]LDQ
!>          LDQ is INTEGER
!>          The leading dimension of the array Q. LDQ >= 1.
!>          If WANTQ = .TRUE., LDQ >= N.
!> 
[in,out]Z
!>          Z is COMPLEX array, dimension (LDZ,N)
!>          On entry, if WANTZ = .TRUE., Z is an N-by-N matrix.
!>          On exit, Z has been postmultiplied by the left unitary
!>          transformation matrix which reorder (A, B); The leading M
!>          columns of Z form orthonormal bases for the specified pair of
!>          left eigenspaces (deflating subspaces).
!>          If WANTZ = .FALSE., Z is not referenced.
!> 
[in]LDZ
!>          LDZ is INTEGER
!>          The leading dimension of the array Z. LDZ >= 1.
!>          If WANTZ = .TRUE., LDZ >= N.
!> 
[out]M
!>          M is INTEGER
!>          The dimension of the specified pair of left and right
!>          eigenspaces, (deflating subspaces) 0 <= M <= N.
!> 
[out]PL
!>          PL is REAL
!> 
[out]PR
!>          PR is REAL
!>
!>          If IJOB = 1, 4 or 5, PL, PR are lower bounds on the
!>          reciprocal  of the norm of  onto left and right
!>          eigenspace with respect to the selected cluster.
!>          0 < PL, PR <= 1.
!>          If M = 0 or M = N, PL = PR  = 1.
!>          If IJOB = 0, 2 or 3 PL, PR are not referenced.
!> 
[out]DIF
!>          DIF is REAL array, dimension (2).
!>          If IJOB >= 2, DIF(1:2) store the estimates of Difu and Difl.
!>          If IJOB = 2 or 4, DIF(1:2) are F-norm-based upper bounds on
!>          Difu and Difl. If IJOB = 3 or 5, DIF(1:2) are 1-norm-based
!>          estimates of Difu and Difl, computed using reversed
!>          communication with CLACN2.
!>          If M = 0 or N, DIF(1:2) = F-norm([A, B]).
!>          If IJOB = 0 or 1, DIF is not referenced.
!> 
[out]WORK
!>          WORK is COMPLEX array, dimension (MAX(1,LWORK))
!>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
!> 
[in]LWORK
!>          LWORK is INTEGER
!>          The dimension of the array WORK. LWORK >=  1
!>          If IJOB = 1, 2 or 4, LWORK >=  2*M*(N-M)
!>          If IJOB = 3 or 5, LWORK >=  4*M*(N-M)
!>
!>          If LWORK = -1, then a workspace query is assumed; the routine
!>          only calculates the optimal size of the WORK array, returns
!>          this value as the first entry of the WORK array, and no error
!>          message related to LWORK is issued by XERBLA.
!> 
[out]IWORK
!>          IWORK is INTEGER array, dimension (MAX(1,LIWORK))
!>          On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
!> 
[in]LIWORK
!>          LIWORK is INTEGER
!>          The dimension of the array IWORK. LIWORK >= 1.
!>          If IJOB = 1, 2 or 4, LIWORK >=  N+2;
!>          If IJOB = 3 or 5, LIWORK >= MAX(N+2, 2*M*(N-M));
!>
!>          If LIWORK = -1, then a workspace query is assumed; the
!>          routine only calculates the optimal size of the IWORK array,
!>          returns this value as the first entry of the IWORK array, and
!>          no error message related to LIWORK is issued by XERBLA.
!> 
[out]INFO
!>          INFO is INTEGER
!>            =0: Successful exit.
!>            <0: If INFO = -i, the i-th argument had an illegal value.
!>            =1: Reordering of (A, B) failed because the transformed
!>                matrix pair (A, B) would be too far from generalized
!>                Schur form; the problem is very ill-conditioned.
!>                (A, B) may have been partially reordered.
!>                If requested, 0 is returned in DIF(*), PL and PR.
!> 
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Further Details:
!>
!>  CTGSEN first collects the selected eigenvalues by computing unitary
!>  U and W that move them to the top left corner of (A, B). In other
!>  words, the selected eigenvalues are the eigenvalues of (A11, B11) in
!>
!>              U**H*(A, B)*W = (A11 A12) (B11 B12) n1
!>                              ( 0  A22),( 0  B22) n2
!>                                n1  n2    n1  n2
!>
!>  where N = n1+n2 and U**H means the conjugate transpose of U. The first
!>  n1 columns of U and W span the specified pair of left and right
!>  eigenspaces (deflating subspaces) of (A, B).
!>
!>  If (A, B) has been obtained from the generalized real Schur
!>  decomposition of a matrix pair (C, D) = Q*(A, B)*Z', then the
!>  reordered generalized Schur form of (C, D) is given by
!>
!>           (C, D) = (Q*U)*(U**H *(A, B)*W)*(Z*W)**H,
!>
!>  and the first n1 columns of Q*U and Z*W span the corresponding
!>  deflating subspaces of (C, D) (Q and Z store Q*U and Z*W, resp.).
!>
!>  Note that if the selected eigenvalue is sufficiently ill-conditioned,
!>  then its value may differ significantly from its value before
!>  reordering.
!>
!>  The reciprocal condition numbers of the left and right eigenspaces
!>  spanned by the first n1 columns of U and W (or Q*U and Z*W) may
!>  be returned in DIF(1:2), corresponding to Difu and Difl, resp.
!>
!>  The Difu and Difl are defined as:
!>
!>       Difu[(A11, B11), (A22, B22)] = sigma-min( Zu )
!>  and
!>       Difl[(A11, B11), (A22, B22)] = Difu[(A22, B22), (A11, B11)],
!>
!>  where sigma-min(Zu) is the smallest singular value of the
!>  (2*n1*n2)-by-(2*n1*n2) matrix
!>
!>       Zu = [ kron(In2, A11)  -kron(A22**H, In1) ]
!>            [ kron(In2, B11)  -kron(B22**H, In1) ].
!>
!>  Here, Inx is the identity matrix of size nx and A22**H is the
!>  conjugate transpose of A22. kron(X, Y) is the Kronecker product between
!>  the matrices X and Y.
!>
!>  When DIF(2) is small, small changes in (A, B) can cause large changes
!>  in the deflating subspace. An approximate (asymptotic) bound on the
!>  maximum angular error in the computed deflating subspaces is
!>
!>       EPS * norm((A, B)) / DIF(2),
!>
!>  where EPS is the machine precision.
!>
!>  The reciprocal norm of the projectors on the left and right
!>  eigenspaces associated with (A11, B11) may be returned in PL and PR.
!>  They are computed as follows. First we compute L and R so that
!>  P*(A, B)*Q is block diagonal, where
!>
!>       P = ( I -L ) n1           Q = ( I R ) n1
!>           ( 0  I ) n2    and        ( 0 I ) n2
!>             n1 n2                    n1 n2
!>
!>  and (L, R) is the solution to the generalized Sylvester equation
!>
!>       A11*R - L*A22 = -A12
!>       B11*R - L*B22 = -B12
!>
!>  Then PL = (F-norm(L)**2+1)**(-1/2) and PR = (F-norm(R)**2+1)**(-1/2).
!>  An approximate (asymptotic) bound on the average absolute error of
!>  the selected eigenvalues is
!>
!>       EPS * norm((A, B)) / PL.
!>
!>  There are also global error bounds which valid for perturbations up
!>  to a certain restriction:  A lower bound (x) on the smallest
!>  F-norm(E,F) for which an eigenvalue of (A11, B11) may move and
!>  coalesce with an eigenvalue of (A22, B22) under perturbation (E,F),
!>  (i.e. (A + E, B + F), is
!>
!>   x = min(Difu,Difl)/((1/(PL*PL)+1/(PR*PR))**(1/2)+2*max(1/PL,1/PR)).
!>
!>  An approximate bound on x can be computed from DIF(1:2), PL and PR.
!>
!>  If y = ( F-norm(E,F) / x) <= 1, the angles between the perturbed
!>  (L', R') and unperturbed (L, R) left and right deflating subspaces
!>  associated with the selected cluster in the (1,1)-blocks can be
!>  bounded as
!>
!>   max-angle(L, L') <= arctan( y * PL / (1 - y * (1 - PL * PL)**(1/2))
!>   max-angle(R, R') <= arctan( y * PR / (1 - y * (1 - PR * PR)**(1/2))
!>
!>  See LAPACK User's Guide section 4.11 or the following references
!>  for more information.
!>
!>  Note that if the default method for computing the Frobenius-norm-
!>  based estimate DIF is not wanted (see CLATDF), then the parameter
!>  IDIFJB (see below) should be changed from 3 to 4 (routine CLATDF
!>  (IJOB = 2 will be used)). See CTGSYL for more details.
!> 
Contributors:
Bo Kagstrom and Peter Poromaa, Department of Computing Science, Umea University, S-901 87 Umea, Sweden.
References:
[1] B. Kagstrom; A Direct Method for Reordering Eigenvalues in the Generalized Real Schur Form of a Regular Matrix Pair (A, B), in M.S. Moonen et al (eds), Linear Algebra for Large Scale and Real-Time Applications, Kluwer Academic Publ. 1993, pp 195-218.
[2] B. Kagstrom and P. Poromaa; Computing Eigenspaces with Specified Eigenvalues of a Regular Matrix Pair (A, B) and Condition Estimation: Theory, Algorithms and Software, Report UMINF - 94.04, Department of Computing Science, Umea University, S-901 87 Umea, Sweden, 1994. Also as LAPACK Working Note 87. To appear in Numerical Algorithms, 1996.
[3] B. Kagstrom and P. Poromaa, LAPACK-Style Algorithms and Software for Solving the Generalized Sylvester Equation and Estimating the Separation between Regular Matrix Pairs, Report UMINF - 93.23, Department of Computing Science, Umea University, S-901 87 Umea, Sweden, December 1993, Revised April 1994, Also as LAPACK working Note 75. To appear in ACM Trans. on Math. Software, Vol 22, No 1, 1996.

Definition at line 428 of file ctgsen.f.

432*
433* -- LAPACK computational routine --
434* -- LAPACK is a software package provided by Univ. of Tennessee, --
435* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
436*
437* .. Scalar Arguments ..
438 LOGICAL WANTQ, WANTZ
439 INTEGER IJOB, INFO, LDA, LDB, LDQ, LDZ, LIWORK, LWORK,
440 $ M, N
441 REAL PL, PR
442* ..
443* .. Array Arguments ..
444 LOGICAL SELECT( * )
445 INTEGER IWORK( * )
446 REAL DIF( * )
447 COMPLEX A( LDA, * ), ALPHA( * ), B( LDB, * ),
448 $ BETA( * ), Q( LDQ, * ), WORK( * ), Z( LDZ, * )
449* ..
450*
451* =====================================================================
452*
453* .. Parameters ..
454 INTEGER IDIFJB
455 parameter( idifjb = 3 )
456 REAL ZERO, ONE
457 parameter( zero = 0.0e+0, one = 1.0e+0 )
458* ..
459* .. Local Scalars ..
460 LOGICAL LQUERY, SWAP, WANTD, WANTD1, WANTD2, WANTP
461 INTEGER I, IERR, IJB, K, KASE, KS, LIWMIN, LWMIN, MN2,
462 $ N1, N2
463 REAL DSCALE, DSUM, RDSCAL, SAFMIN
464 COMPLEX TEMP1, TEMP2
465* ..
466* .. Local Arrays ..
467 INTEGER ISAVE( 3 )
468* ..
469* .. External Functions ..
470 REAL SROUNDUP_LWORK
471 EXTERNAL sroundup_lwork
472* ..
473* .. External Subroutines ..
474 REAL SLAMCH
475 EXTERNAL clacn2, clacpy, classq, cscal, ctgexc,
476 $ ctgsyl,
477 $ slamch, xerbla
478* ..
479* .. Intrinsic Functions ..
480 INTRINSIC abs, cmplx, conjg, max, sqrt
481* ..
482* .. Executable Statements ..
483*
484* Decode and test the input parameters
485*
486 info = 0
487 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
488*
489 IF( ijob.LT.0 .OR. ijob.GT.5 ) THEN
490 info = -1
491 ELSE IF( n.LT.0 ) THEN
492 info = -5
493 ELSE IF( lda.LT.max( 1, n ) ) THEN
494 info = -7
495 ELSE IF( ldb.LT.max( 1, n ) ) THEN
496 info = -9
497 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) ) THEN
498 info = -13
499 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) ) THEN
500 info = -15
501 END IF
502*
503 IF( info.NE.0 ) THEN
504 CALL xerbla( 'CTGSEN', -info )
505 RETURN
506 END IF
507*
508 ierr = 0
509*
510 wantp = ijob.EQ.1 .OR. ijob.GE.4
511 wantd1 = ijob.EQ.2 .OR. ijob.EQ.4
512 wantd2 = ijob.EQ.3 .OR. ijob.EQ.5
513 wantd = wantd1 .OR. wantd2
514*
515* Set M to the dimension of the specified pair of deflating
516* subspaces.
517*
518 m = 0
519 IF( .NOT.lquery .OR. ijob.NE.0 ) THEN
520 DO 10 k = 1, n
521 alpha( k ) = a( k, k )
522 beta( k ) = b( k, k )
523 IF( k.LT.n ) THEN
524 IF( SELECT( k ) )
525 $ m = m + 1
526 ELSE
527 IF( SELECT( n ) )
528 $ m = m + 1
529 END IF
530 10 CONTINUE
531 END IF
532*
533 IF( ijob.EQ.1 .OR. ijob.EQ.2 .OR. ijob.EQ.4 ) THEN
534 lwmin = max( 1, 2*m*(n-m) )
535 liwmin = max( 1, n+2 )
536 ELSE IF( ijob.EQ.3 .OR. ijob.EQ.5 ) THEN
537 lwmin = max( 1, 4*m*(n-m) )
538 liwmin = max( 1, 2*m*(n-m), n+2 )
539 ELSE
540 lwmin = 1
541 liwmin = 1
542 END IF
543*
544 work( 1 ) = sroundup_lwork(lwmin)
545 iwork( 1 ) = liwmin
546*
547 IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
548 info = -21
549 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery ) THEN
550 info = -23
551 END IF
552*
553 IF( info.NE.0 ) THEN
554 CALL xerbla( 'CTGSEN', -info )
555 RETURN
556 ELSE IF( lquery ) THEN
557 RETURN
558 END IF
559*
560* Quick return if possible.
561*
562 IF( m.EQ.n .OR. m.EQ.0 ) THEN
563 IF( wantp ) THEN
564 pl = one
565 pr = one
566 END IF
567 IF( wantd ) THEN
568 dscale = zero
569 dsum = one
570 DO 20 i = 1, n
571 CALL classq( n, a( 1, i ), 1, dscale, dsum )
572 CALL classq( n, b( 1, i ), 1, dscale, dsum )
573 20 CONTINUE
574 dif( 1 ) = dscale*sqrt( dsum )
575 dif( 2 ) = dif( 1 )
576 END IF
577 GO TO 70
578 END IF
579*
580* Get machine constant
581*
582 safmin = slamch( 'S' )
583*
584* Collect the selected blocks at the top-left corner of (A, B).
585*
586 ks = 0
587 DO 30 k = 1, n
588 swap = SELECT( k )
589 IF( swap ) THEN
590 ks = ks + 1
591*
592* Swap the K-th block to position KS. Compute unitary Q
593* and Z that will swap adjacent diagonal blocks in (A, B).
594*
595 IF( k.NE.ks )
596 $ CALL ctgexc( wantq, wantz, n, a, lda, b, ldb, q, ldq,
597 $ z,
598 $ ldz, k, ks, ierr )
599*
600 IF( ierr.GT.0 ) THEN
601*
602* Swap is rejected: exit.
603*
604 info = 1
605 IF( wantp ) THEN
606 pl = zero
607 pr = zero
608 END IF
609 IF( wantd ) THEN
610 dif( 1 ) = zero
611 dif( 2 ) = zero
612 END IF
613 GO TO 70
614 END IF
615 END IF
616 30 CONTINUE
617 IF( wantp ) THEN
618*
619* Solve generalized Sylvester equation for R and L:
620* A11 * R - L * A22 = A12
621* B11 * R - L * B22 = B12
622*
623 n1 = m
624 n2 = n - m
625 i = n1 + 1
626 CALL clacpy( 'Full', n1, n2, a( 1, i ), lda, work, n1 )
627 CALL clacpy( 'Full', n1, n2, b( 1, i ), ldb,
628 $ work( n1*n2+1 ),
629 $ n1 )
630 ijb = 0
631 CALL ctgsyl( 'N', ijb, n1, n2, a, lda, a( i, i ), lda, work,
632 $ n1, b, ldb, b( i, i ), ldb, work( n1*n2+1 ), n1,
633 $ dscale, dif( 1 ), work( n1*n2*2+1 ),
634 $ lwork-2*n1*n2, iwork, ierr )
635*
636* Estimate the reciprocal of norms of "projections" onto
637* left and right eigenspaces
638*
639 rdscal = zero
640 dsum = one
641 CALL classq( n1*n2, work, 1, rdscal, dsum )
642 pl = rdscal*sqrt( dsum )
643 IF( pl.EQ.zero ) THEN
644 pl = one
645 ELSE
646 pl = dscale / ( sqrt( dscale*dscale / pl+pl )*sqrt( pl ) )
647 END IF
648 rdscal = zero
649 dsum = one
650 CALL classq( n1*n2, work( n1*n2+1 ), 1, rdscal, dsum )
651 pr = rdscal*sqrt( dsum )
652 IF( pr.EQ.zero ) THEN
653 pr = one
654 ELSE
655 pr = dscale / ( sqrt( dscale*dscale / pr+pr )*sqrt( pr ) )
656 END IF
657 END IF
658 IF( wantd ) THEN
659*
660* Compute estimates Difu and Difl.
661*
662 IF( wantd1 ) THEN
663 n1 = m
664 n2 = n - m
665 i = n1 + 1
666 ijb = idifjb
667*
668* Frobenius norm-based Difu estimate.
669*
670 CALL ctgsyl( 'N', ijb, n1, n2, a, lda, a( i, i ), lda,
671 $ work,
672 $ n1, b, ldb, b( i, i ), ldb, work( n1*n2+1 ),
673 $ n1, dscale, dif( 1 ), work( n1*n2*2+1 ),
674 $ lwork-2*n1*n2, iwork, ierr )
675*
676* Frobenius norm-based Difl estimate.
677*
678 CALL ctgsyl( 'N', ijb, n2, n1, a( i, i ), lda, a, lda,
679 $ work,
680 $ n2, b( i, i ), ldb, b, ldb, work( n1*n2+1 ),
681 $ n2, dscale, dif( 2 ), work( n1*n2*2+1 ),
682 $ lwork-2*n1*n2, iwork, ierr )
683 ELSE
684*
685* Compute 1-norm-based estimates of Difu and Difl using
686* reversed communication with CLACN2. In each step a
687* generalized Sylvester equation or a transposed variant
688* is solved.
689*
690 kase = 0
691 n1 = m
692 n2 = n - m
693 i = n1 + 1
694 ijb = 0
695 mn2 = 2*n1*n2
696*
697* 1-norm-based estimate of Difu.
698*
699 40 CONTINUE
700 CALL clacn2( mn2, work( mn2+1 ), work, dif( 1 ), kase,
701 $ isave )
702 IF( kase.NE.0 ) THEN
703 IF( kase.EQ.1 ) THEN
704*
705* Solve generalized Sylvester equation
706*
707 CALL ctgsyl( 'N', ijb, n1, n2, a, lda, a( i, i ),
708 $ lda,
709 $ work, n1, b, ldb, b( i, i ), ldb,
710 $ work( n1*n2+1 ), n1, dscale, dif( 1 ),
711 $ work( n1*n2*2+1 ), lwork-2*n1*n2, iwork,
712 $ ierr )
713 ELSE
714*
715* Solve the transposed variant.
716*
717 CALL ctgsyl( 'C', ijb, n1, n2, a, lda, a( i, i ),
718 $ lda,
719 $ work, n1, b, ldb, b( i, i ), ldb,
720 $ work( n1*n2+1 ), n1, dscale, dif( 1 ),
721 $ work( n1*n2*2+1 ), lwork-2*n1*n2, iwork,
722 $ ierr )
723 END IF
724 GO TO 40
725 END IF
726 dif( 1 ) = dscale / dif( 1 )
727*
728* 1-norm-based estimate of Difl.
729*
730 50 CONTINUE
731 CALL clacn2( mn2, work( mn2+1 ), work, dif( 2 ), kase,
732 $ isave )
733 IF( kase.NE.0 ) THEN
734 IF( kase.EQ.1 ) THEN
735*
736* Solve generalized Sylvester equation
737*
738 CALL ctgsyl( 'N', ijb, n2, n1, a( i, i ), lda, a,
739 $ lda,
740 $ work, n2, b( i, i ), ldb, b, ldb,
741 $ work( n1*n2+1 ), n2, dscale, dif( 2 ),
742 $ work( n1*n2*2+1 ), lwork-2*n1*n2, iwork,
743 $ ierr )
744 ELSE
745*
746* Solve the transposed variant.
747*
748 CALL ctgsyl( 'C', ijb, n2, n1, a( i, i ), lda, a,
749 $ lda,
750 $ work, n2, b, ldb, b( i, i ), ldb,
751 $ work( n1*n2+1 ), n2, dscale, dif( 2 ),
752 $ work( n1*n2*2+1 ), lwork-2*n1*n2, iwork,
753 $ ierr )
754 END IF
755 GO TO 50
756 END IF
757 dif( 2 ) = dscale / dif( 2 )
758 END IF
759 END IF
760*
761* If B(K,K) is complex, make it real and positive (normalization
762* of the generalized Schur form) and Store the generalized
763* eigenvalues of reordered pair (A, B)
764*
765 DO 60 k = 1, n
766 dscale = abs( b( k, k ) )
767 IF( dscale.GT.safmin ) THEN
768 temp1 = conjg( b( k, k ) / dscale )
769 temp2 = b( k, k ) / dscale
770 b( k, k ) = dscale
771 CALL cscal( n-k, temp1, b( k, k+1 ), ldb )
772 CALL cscal( n-k+1, temp1, a( k, k ), lda )
773 IF( wantq )
774 $ CALL cscal( n, temp2, q( 1, k ), 1 )
775 ELSE
776 b( k, k ) = cmplx( zero, zero )
777 END IF
778*
779 alpha( k ) = a( k, k )
780 beta( k ) = b( k, k )
781*
782 60 CONTINUE
783*
784 70 CONTINUE
785*
786 work( 1 ) = sroundup_lwork(lwmin)
787 iwork( 1 ) = liwmin
788*
789 RETURN
790*
791* End of CTGSEN
792*
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine clacn2(n, v, x, est, kase, isave)
CLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matrix-vec...
Definition clacn2.f:131
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
Definition clacpy.f:101
real function slamch(cmach)
SLAMCH
Definition slamch.f:68
subroutine classq(n, x, incx, scale, sumsq)
CLASSQ updates a sum of squares represented in scaled form.
Definition classq.f90:122
real function sroundup_lwork(lwork)
SROUNDUP_LWORK
subroutine cscal(n, ca, cx, incx)
CSCAL
Definition cscal.f:78
subroutine ctgexc(wantq, wantz, n, a, lda, b, ldb, q, ldq, z, ldz, ifst, ilst, info)
CTGEXC
Definition ctgexc.f:198
subroutine ctgsyl(trans, ijob, m, n, a, lda, b, ldb, c, ldc, d, ldd, e, lde, f, ldf, scale, dif, work, lwork, iwork, info)
CTGSYL
Definition ctgsyl.f:294
Here is the call graph for this function:
Here is the caller graph for this function: