LAPACK  3.8.0
LAPACK: Linear Algebra PACKage
ztrexc.f
Go to the documentation of this file.
1 *> \brief \b ZTREXC
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download ZTREXC + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ztrexc.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ztrexc.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ztrexc.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE ZTREXC( COMPQ, N, T, LDT, Q, LDQ, IFST, ILST, INFO )
22 *
23 * .. Scalar Arguments ..
24 * CHARACTER COMPQ
25 * INTEGER IFST, ILST, INFO, LDQ, LDT, N
26 * ..
27 * .. Array Arguments ..
28 * COMPLEX*16 Q( LDQ, * ), T( LDT, * )
29 * ..
30 *
31 *
32 *> \par Purpose:
33 * =============
34 *>
35 *> \verbatim
36 *>
37 *> ZTREXC reorders the Schur factorization of a complex matrix
38 *> A = Q*T*Q**H, so that the diagonal element of T with row index IFST
39 *> is moved to row ILST.
40 *>
41 *> The Schur form T is reordered by a unitary similarity transformation
42 *> Z**H*T*Z, and optionally the matrix Q of Schur vectors is updated by
43 *> postmultplying it with Z.
44 *> \endverbatim
45 *
46 * Arguments:
47 * ==========
48 *
49 *> \param[in] COMPQ
50 *> \verbatim
51 *> COMPQ is CHARACTER*1
52 *> = 'V': update the matrix Q of Schur vectors;
53 *> = 'N': do not update Q.
54 *> \endverbatim
55 *>
56 *> \param[in] N
57 *> \verbatim
58 *> N is INTEGER
59 *> The order of the matrix T. N >= 0.
60 *> If N == 0 arguments ILST and IFST may be any value.
61 *> \endverbatim
62 *>
63 *> \param[in,out] T
64 *> \verbatim
65 *> T is COMPLEX*16 array, dimension (LDT,N)
66 *> On entry, the upper triangular matrix T.
67 *> On exit, the reordered upper triangular matrix.
68 *> \endverbatim
69 *>
70 *> \param[in] LDT
71 *> \verbatim
72 *> LDT is INTEGER
73 *> The leading dimension of the array T. LDT >= max(1,N).
74 *> \endverbatim
75 *>
76 *> \param[in,out] Q
77 *> \verbatim
78 *> Q is COMPLEX*16 array, dimension (LDQ,N)
79 *> On entry, if COMPQ = 'V', the matrix Q of Schur vectors.
80 *> On exit, if COMPQ = 'V', Q has been postmultiplied by the
81 *> unitary transformation matrix Z which reorders T.
82 *> If COMPQ = 'N', Q is not referenced.
83 *> \endverbatim
84 *>
85 *> \param[in] LDQ
86 *> \verbatim
87 *> LDQ is INTEGER
88 *> The leading dimension of the array Q. LDQ >= 1, and if
89 *> COMPQ = 'V', LDQ >= max(1,N).
90 *> \endverbatim
91 *>
92 *> \param[in] IFST
93 *> \verbatim
94 *> IFST is INTEGER
95 *> \endverbatim
96 *>
97 *> \param[in] ILST
98 *> \verbatim
99 *> ILST is INTEGER
100 *>
101 *> Specify the reordering of the diagonal elements of T:
102 *> The element with row index IFST is moved to row ILST by a
103 *> sequence of transpositions between adjacent elements.
104 *> 1 <= IFST <= N; 1 <= ILST <= N.
105 *> \endverbatim
106 *>
107 *> \param[out] INFO
108 *> \verbatim
109 *> INFO is INTEGER
110 *> = 0: successful exit
111 *> < 0: if INFO = -i, the i-th argument had an illegal value
112 *> \endverbatim
113 *
114 * Authors:
115 * ========
116 *
117 *> \author Univ. of Tennessee
118 *> \author Univ. of California Berkeley
119 *> \author Univ. of Colorado Denver
120 *> \author NAG Ltd.
121 *
122 *> \date December 2016
123 *
124 *> \ingroup complex16OTHERcomputational
125 *
126 * =====================================================================
127  SUBROUTINE ztrexc( COMPQ, N, T, LDT, Q, LDQ, IFST, ILST, INFO )
128 *
129 * -- LAPACK computational routine (version 3.7.0) --
130 * -- LAPACK is a software package provided by Univ. of Tennessee, --
131 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
132 * December 2016
133 *
134 * .. Scalar Arguments ..
135  CHARACTER COMPQ
136  INTEGER IFST, ILST, INFO, LDQ, LDT, N
137 * ..
138 * .. Array Arguments ..
139  COMPLEX*16 Q( ldq, * ), T( ldt, * )
140 * ..
141 *
142 * =====================================================================
143 *
144 * .. Local Scalars ..
145  LOGICAL WANTQ
146  INTEGER K, M1, M2, M3
147  DOUBLE PRECISION CS
148  COMPLEX*16 SN, T11, T22, TEMP
149 * ..
150 * .. External Functions ..
151  LOGICAL LSAME
152  EXTERNAL lsame
153 * ..
154 * .. External Subroutines ..
155  EXTERNAL xerbla, zlartg, zrot
156 * ..
157 * .. Intrinsic Functions ..
158  INTRINSIC dconjg, max
159 * ..
160 * .. Executable Statements ..
161 *
162 * Decode and test the input parameters.
163 *
164  info = 0
165  wantq = lsame( compq, 'V' )
166  IF( .NOT.lsame( compq, 'N' ) .AND. .NOT.wantq ) THEN
167  info = -1
168  ELSE IF( n.LT.0 ) THEN
169  info = -2
170  ELSE IF( ldt.LT.max( 1, n ) ) THEN
171  info = -4
172  ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.max( 1, n ) ) ) THEN
173  info = -6
174  ELSE IF(( ifst.LT.1 .OR. ifst.GT.n ).AND.( n.GT.0 )) THEN
175  info = -7
176  ELSE IF(( ilst.LT.1 .OR. ilst.GT.n ).AND.( n.GT.0 )) THEN
177  info = -8
178  END IF
179  IF( info.NE.0 ) THEN
180  CALL xerbla( 'ZTREXC', -info )
181  RETURN
182  END IF
183 *
184 * Quick return if possible
185 *
186  IF( n.LE.1 .OR. ifst.EQ.ilst )
187  $ RETURN
188 *
189  IF( ifst.LT.ilst ) THEN
190 *
191 * Move the IFST-th diagonal element forward down the diagonal.
192 *
193  m1 = 0
194  m2 = -1
195  m3 = 1
196  ELSE
197 *
198 * Move the IFST-th diagonal element backward up the diagonal.
199 *
200  m1 = -1
201  m2 = 0
202  m3 = -1
203  END IF
204 *
205  DO 10 k = ifst + m1, ilst + m2, m3
206 *
207 * Interchange the k-th and (k+1)-th diagonal elements.
208 *
209  t11 = t( k, k )
210  t22 = t( k+1, k+1 )
211 *
212 * Determine the transformation to perform the interchange.
213 *
214  CALL zlartg( t( k, k+1 ), t22-t11, cs, sn, temp )
215 *
216 * Apply transformation to the matrix T.
217 *
218  IF( k+2.LE.n )
219  $ CALL zrot( n-k-1, t( k, k+2 ), ldt, t( k+1, k+2 ), ldt, cs,
220  $ sn )
221  CALL zrot( k-1, t( 1, k ), 1, t( 1, k+1 ), 1, cs,
222  $ dconjg( sn ) )
223 *
224  t( k, k ) = t22
225  t( k+1, k+1 ) = t11
226 *
227  IF( wantq ) THEN
228 *
229 * Accumulate transformation in the matrix Q.
230 *
231  CALL zrot( n, q( 1, k ), 1, q( 1, k+1 ), 1, cs,
232  $ dconjg( sn ) )
233  END IF
234 *
235  10 CONTINUE
236 *
237  RETURN
238 *
239 * End of ZTREXC
240 *
241  END
subroutine zrot(N, CX, INCX, CY, INCY, C, S)
ZROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors...
Definition: zrot.f:105
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
subroutine ztrexc(COMPQ, N, T, LDT, Q, LDQ, IFST, ILST, INFO)
ZTREXC
Definition: ztrexc.f:128
subroutine zlartg(F, G, CS, SN, R)
ZLARTG generates a plane rotation with real cosine and complex sine.
Definition: zlartg.f:105