301 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Fortran
		
	
	
	
			
		
		
	
	
			301 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Fortran
		
	
	
	
*> \brief \b CTGEXC
 | 
						|
*
 | 
						|
*  =========== DOCUMENTATION ===========
 | 
						|
*
 | 
						|
* Online html documentation available at
 | 
						|
*            http://www.netlib.org/lapack/explore-html/
 | 
						|
*
 | 
						|
*> \htmlonly
 | 
						|
*> Download CTGEXC + dependencies
 | 
						|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ctgexc.f">
 | 
						|
*> [TGZ]</a>
 | 
						|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ctgexc.f">
 | 
						|
*> [ZIP]</a>
 | 
						|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ctgexc.f">
 | 
						|
*> [TXT]</a>
 | 
						|
*> \endhtmlonly
 | 
						|
*
 | 
						|
*  Definition:
 | 
						|
*  ===========
 | 
						|
*
 | 
						|
*       SUBROUTINE CTGEXC( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z,
 | 
						|
*                          LDZ, IFST, ILST, INFO )
 | 
						|
*
 | 
						|
*       .. Scalar Arguments ..
 | 
						|
*       LOGICAL            WANTQ, WANTZ
 | 
						|
*       INTEGER            IFST, ILST, INFO, LDA, LDB, LDQ, LDZ, N
 | 
						|
*       ..
 | 
						|
*       .. Array Arguments ..
 | 
						|
*       COMPLEX            A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
 | 
						|
*      $                   Z( LDZ, * )
 | 
						|
*       ..
 | 
						|
*
 | 
						|
*
 | 
						|
*> \par Purpose:
 | 
						|
*  =============
 | 
						|
*>
 | 
						|
*> \verbatim
 | 
						|
*>
 | 
						|
*> CTGEXC reorders the generalized Schur decomposition of a complex
 | 
						|
*> matrix pair (A,B), using an unitary equivalence transformation
 | 
						|
*> (A, B) := Q * (A, B) * Z**H, so that the diagonal block of (A, B) with
 | 
						|
*> row index IFST is moved to row ILST.
 | 
						|
*>
 | 
						|
*> (A, B) must be in generalized Schur canonical form, that is, A and
 | 
						|
*> B are both upper triangular.
 | 
						|
*>
 | 
						|
*> Optionally, the matrices Q and Z of generalized Schur vectors are
 | 
						|
*> updated.
 | 
						|
*>
 | 
						|
*>        Q(in) * A(in) * Z(in)**H = Q(out) * A(out) * Z(out)**H
 | 
						|
*>        Q(in) * B(in) * Z(in)**H = Q(out) * B(out) * Z(out)**H
 | 
						|
*> \endverbatim
 | 
						|
*
 | 
						|
*  Arguments:
 | 
						|
*  ==========
 | 
						|
*
 | 
						|
*> \param[in] WANTQ
 | 
						|
*> \verbatim
 | 
						|
*>          WANTQ is LOGICAL
 | 
						|
*>          .TRUE. : update the left transformation matrix Q;
 | 
						|
*>          .FALSE.: do not update Q.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in] WANTZ
 | 
						|
*> \verbatim
 | 
						|
*>          WANTZ is LOGICAL
 | 
						|
*>          .TRUE. : update the right transformation matrix Z;
 | 
						|
*>          .FALSE.: do not update Z.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in] N
 | 
						|
*> \verbatim
 | 
						|
*>          N is INTEGER
 | 
						|
*>          The order of the matrices A and B. N >= 0.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in,out] A
 | 
						|
*> \verbatim
 | 
						|
*>          A is COMPLEX array, dimension (LDA,N)
 | 
						|
*>          On entry, the upper triangular matrix A in the pair (A, B).
 | 
						|
*>          On exit, the updated matrix A.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in] LDA
 | 
						|
*> \verbatim
 | 
						|
*>          LDA is INTEGER
 | 
						|
*>          The leading dimension of the array A. LDA >= max(1,N).
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in,out] B
 | 
						|
*> \verbatim
 | 
						|
*>          B is COMPLEX array, dimension (LDB,N)
 | 
						|
*>          On entry, the upper triangular matrix B in the pair (A, B).
 | 
						|
*>          On exit, the updated matrix B.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in] LDB
 | 
						|
*> \verbatim
 | 
						|
*>          LDB is INTEGER
 | 
						|
*>          The leading dimension of the array B. LDB >= max(1,N).
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in,out] Q
 | 
						|
*> \verbatim
 | 
						|
*>          Q is COMPLEX array, dimension (LDQ,N)
 | 
						|
*>          On entry, if WANTQ = .TRUE., the unitary matrix Q.
 | 
						|
*>          On exit, the updated matrix Q.
 | 
						|
*>          If WANTQ = .FALSE., Q is not referenced.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in] LDQ
 | 
						|
*> \verbatim
 | 
						|
*>          LDQ is INTEGER
 | 
						|
*>          The leading dimension of the array Q. LDQ >= 1;
 | 
						|
*>          If WANTQ = .TRUE., LDQ >= N.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in,out] Z
 | 
						|
*> \verbatim
 | 
						|
*>          Z is COMPLEX array, dimension (LDZ,N)
 | 
						|
*>          On entry, if WANTZ = .TRUE., the unitary matrix Z.
 | 
						|
*>          On exit, the updated matrix Z.
 | 
						|
*>          If WANTZ = .FALSE., Z is not referenced.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in] LDZ
 | 
						|
*> \verbatim
 | 
						|
*>          LDZ is INTEGER
 | 
						|
*>          The leading dimension of the array Z. LDZ >= 1;
 | 
						|
*>          If WANTZ = .TRUE., LDZ >= N.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in] IFST
 | 
						|
*> \verbatim
 | 
						|
*>          IFST is INTEGER
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in,out] ILST
 | 
						|
*> \verbatim
 | 
						|
*>          ILST is INTEGER
 | 
						|
*>          Specify the reordering of the diagonal blocks of (A, B).
 | 
						|
*>          The block with row index IFST is moved to row ILST, by a
 | 
						|
*>          sequence of swapping between adjacent blocks.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[out] INFO
 | 
						|
*> \verbatim
 | 
						|
*>          INFO is INTEGER
 | 
						|
*>           =0:  Successful exit.
 | 
						|
*>           <0:  if INFO = -i, the i-th argument had an illegal value.
 | 
						|
*>           =1:  The transformed matrix pair (A, B) would be too far
 | 
						|
*>                from generalized Schur form; the problem is ill-
 | 
						|
*>                conditioned. (A, B) may have been partially reordered,
 | 
						|
*>                and ILST points to the first row of the current
 | 
						|
*>                position of the block being moved.
 | 
						|
*> \endverbatim
 | 
						|
*
 | 
						|
*  Authors:
 | 
						|
*  ========
 | 
						|
*
 | 
						|
*> \author Univ. of Tennessee
 | 
						|
*> \author Univ. of California Berkeley
 | 
						|
*> \author Univ. of Colorado Denver
 | 
						|
*> \author NAG Ltd.
 | 
						|
*
 | 
						|
*> \date June 2017
 | 
						|
*
 | 
						|
*> \ingroup complexGEcomputational
 | 
						|
*
 | 
						|
*> \par Contributors:
 | 
						|
*  ==================
 | 
						|
*>
 | 
						|
*>     Bo Kagstrom and Peter Poromaa, Department of Computing Science,
 | 
						|
*>     Umea University, S-901 87 Umea, Sweden.
 | 
						|
*
 | 
						|
*> \par 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.
 | 
						|
*> \n
 | 
						|
*>  [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.
 | 
						|
*> \n
 | 
						|
*>  [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.
 | 
						|
*>
 | 
						|
*  =====================================================================
 | 
						|
      SUBROUTINE CTGEXC( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z,
 | 
						|
     $                   LDZ, IFST, ILST, INFO )
 | 
						|
*
 | 
						|
*  -- LAPACK computational routine (version 3.7.1) --
 | 
						|
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
 | 
						|
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
 | 
						|
*     June 2017
 | 
						|
*
 | 
						|
*     .. Scalar Arguments ..
 | 
						|
      LOGICAL            WANTQ, WANTZ
 | 
						|
      INTEGER            IFST, ILST, INFO, LDA, LDB, LDQ, LDZ, N
 | 
						|
*     ..
 | 
						|
*     .. Array Arguments ..
 | 
						|
      COMPLEX            A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
 | 
						|
     $                   Z( LDZ, * )
 | 
						|
*     ..
 | 
						|
*
 | 
						|
*  =====================================================================
 | 
						|
*
 | 
						|
*     .. Local Scalars ..
 | 
						|
      INTEGER            HERE
 | 
						|
*     ..
 | 
						|
*     .. External Subroutines ..
 | 
						|
      EXTERNAL           CTGEX2, XERBLA
 | 
						|
*     ..
 | 
						|
*     .. Intrinsic Functions ..
 | 
						|
      INTRINSIC          MAX
 | 
						|
*     ..
 | 
						|
*     .. Executable Statements ..
 | 
						|
*
 | 
						|
*     Decode and test input arguments.
 | 
						|
      INFO = 0
 | 
						|
      IF( N.LT.0 ) THEN
 | 
						|
         INFO = -3
 | 
						|
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
 | 
						|
         INFO = -5
 | 
						|
      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
 | 
						|
         INFO = -7
 | 
						|
      ELSE IF( LDQ.LT.1 .OR. WANTQ .AND. ( LDQ.LT.MAX( 1, N ) ) ) THEN
 | 
						|
         INFO = -9
 | 
						|
      ELSE IF( LDZ.LT.1 .OR. WANTZ .AND. ( LDZ.LT.MAX( 1, N ) ) ) THEN
 | 
						|
         INFO = -11
 | 
						|
      ELSE IF( IFST.LT.1 .OR. IFST.GT.N ) THEN
 | 
						|
         INFO = -12
 | 
						|
      ELSE IF( ILST.LT.1 .OR. ILST.GT.N ) THEN
 | 
						|
         INFO = -13
 | 
						|
      END IF
 | 
						|
      IF( INFO.NE.0 ) THEN
 | 
						|
         CALL XERBLA( 'CTGEXC', -INFO )
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
*     Quick return if possible
 | 
						|
*
 | 
						|
      IF( N.LE.1 )
 | 
						|
     $   RETURN
 | 
						|
      IF( IFST.EQ.ILST )
 | 
						|
     $   RETURN
 | 
						|
*
 | 
						|
      IF( IFST.LT.ILST ) THEN
 | 
						|
*
 | 
						|
         HERE = IFST
 | 
						|
*
 | 
						|
   10    CONTINUE
 | 
						|
*
 | 
						|
*        Swap with next one below
 | 
						|
*
 | 
						|
         CALL CTGEX2( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, LDZ,
 | 
						|
     $                HERE, INFO )
 | 
						|
         IF( INFO.NE.0 ) THEN
 | 
						|
            ILST = HERE
 | 
						|
            RETURN
 | 
						|
         END IF
 | 
						|
         HERE = HERE + 1
 | 
						|
         IF( HERE.LT.ILST )
 | 
						|
     $      GO TO 10
 | 
						|
         HERE = HERE - 1
 | 
						|
      ELSE
 | 
						|
         HERE = IFST - 1
 | 
						|
*
 | 
						|
   20    CONTINUE
 | 
						|
*
 | 
						|
*        Swap with next one above
 | 
						|
*
 | 
						|
         CALL CTGEX2( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, LDZ,
 | 
						|
     $                HERE, INFO )
 | 
						|
         IF( INFO.NE.0 ) THEN
 | 
						|
            ILST = HERE
 | 
						|
            RETURN
 | 
						|
         END IF
 | 
						|
         HERE = HERE - 1
 | 
						|
         IF( HERE.GE.ILST )
 | 
						|
     $      GO TO 20
 | 
						|
         HERE = HERE + 1
 | 
						|
      END IF
 | 
						|
      ILST = HERE
 | 
						|
      RETURN
 | 
						|
*
 | 
						|
*     End of CTGEXC
 | 
						|
*
 | 
						|
      END
 |