LAPACK  3.4.2
LAPACK: Linear Algebra PACKage
 All Files Functions Groups
stgsen.f
Go to the documentation of this file.
1 *> \brief \b STGSEN
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download STGSEN + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/stgsen.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/stgsen.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/stgsen.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE STGSEN( IJOB, WANTQ, WANTZ, SELECT, N, A, LDA, B, LDB,
22 * ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, M, PL,
23 * PR, DIF, WORK, LWORK, IWORK, LIWORK, INFO )
24 *
25 * .. Scalar Arguments ..
26 * LOGICAL WANTQ, WANTZ
27 * INTEGER IJOB, INFO, LDA, LDB, LDQ, LDZ, LIWORK, LWORK,
28 * $ M, N
29 * REAL PL, PR
30 * ..
31 * .. Array Arguments ..
32 * LOGICAL SELECT( * )
33 * INTEGER IWORK( * )
34 * REAL A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
35 * $ B( LDB, * ), BETA( * ), DIF( * ), Q( LDQ, * ),
36 * $ WORK( * ), Z( LDZ, * )
37 * ..
38 *
39 *
40 *> \par Purpose:
41 * =============
42 *>
43 *> \verbatim
44 *>
45 *> STGSEN reorders the generalized real Schur decomposition of a real
46 *> matrix pair (A, B) (in terms of an orthonormal equivalence trans-
47 *> formation Q**T * (A, B) * Z), so that a selected cluster of eigenvalues
48 *> appears in the leading diagonal blocks of the upper quasi-triangular
49 *> matrix A and the upper triangular B. The leading columns of Q and
50 *> Z form orthonormal bases of the corresponding left and right eigen-
51 *> spaces (deflating subspaces). (A, B) must be in generalized real
52 *> Schur canonical form (as returned by SGGES), i.e. A is block upper
53 *> triangular with 1-by-1 and 2-by-2 diagonal blocks. B is upper
54 *> triangular.
55 *>
56 *> STGSEN also computes the generalized eigenvalues
57 *>
58 *> w(j) = (ALPHAR(j) + i*ALPHAI(j))/BETA(j)
59 *>
60 *> of the reordered matrix pair (A, B).
61 *>
62 *> Optionally, STGSEN computes the estimates of reciprocal condition
63 *> numbers for eigenvalues and eigenspaces. These are Difu[(A11,B11),
64 *> (A22,B22)] and Difl[(A11,B11), (A22,B22)], i.e. the separation(s)
65 *> between the matrix pairs (A11, B11) and (A22,B22) that correspond to
66 *> the selected cluster and the eigenvalues outside the cluster, resp.,
67 *> and norms of "projections" onto left and right eigenspaces w.r.t.
68 *> the selected cluster in the (1,1)-block.
69 *> \endverbatim
70 *
71 * Arguments:
72 * ==========
73 *
74 *> \param[in] IJOB
75 *> \verbatim
76 *> IJOB is INTEGER
77 *> Specifies whether condition numbers are required for the
78 *> cluster of eigenvalues (PL and PR) or the deflating subspaces
79 *> (Difu and Difl):
80 *> =0: Only reorder w.r.t. SELECT. No extras.
81 *> =1: Reciprocal of norms of "projections" onto left and right
82 *> eigenspaces w.r.t. the selected cluster (PL and PR).
83 *> =2: Upper bounds on Difu and Difl. F-norm-based estimate
84 *> (DIF(1:2)).
85 *> =3: Estimate of Difu and Difl. 1-norm-based estimate
86 *> (DIF(1:2)).
87 *> About 5 times as expensive as IJOB = 2.
88 *> =4: Compute PL, PR and DIF (i.e. 0, 1 and 2 above): Economic
89 *> version to get it all.
90 *> =5: Compute PL, PR and DIF (i.e. 0, 1 and 3 above)
91 *> \endverbatim
92 *>
93 *> \param[in] WANTQ
94 *> \verbatim
95 *> WANTQ is LOGICAL
96 *> .TRUE. : update the left transformation matrix Q;
97 *> .FALSE.: do not update Q.
98 *> \endverbatim
99 *>
100 *> \param[in] WANTZ
101 *> \verbatim
102 *> WANTZ is LOGICAL
103 *> .TRUE. : update the right transformation matrix Z;
104 *> .FALSE.: do not update Z.
105 *> \endverbatim
106 *>
107 *> \param[in] SELECT
108 *> \verbatim
109 *> SELECT is LOGICAL array, dimension (N)
110 *> SELECT specifies the eigenvalues in the selected cluster.
111 *> To select a real eigenvalue w(j), SELECT(j) must be set to
112 *> .TRUE.. To select a complex conjugate pair of eigenvalues
113 *> w(j) and w(j+1), corresponding to a 2-by-2 diagonal block,
114 *> either SELECT(j) or SELECT(j+1) or both must be set to
115 *> .TRUE.; a complex conjugate pair of eigenvalues must be
116 *> either both included in the cluster or both excluded.
117 *> \endverbatim
118 *>
119 *> \param[in] N
120 *> \verbatim
121 *> N is INTEGER
122 *> The order of the matrices A and B. N >= 0.
123 *> \endverbatim
124 *>
125 *> \param[in,out] A
126 *> \verbatim
127 *> A is REAL array, dimension(LDA,N)
128 *> On entry, the upper quasi-triangular matrix A, with (A, B) in
129 *> generalized real Schur canonical form.
130 *> On exit, A is overwritten by the reordered matrix A.
131 *> \endverbatim
132 *>
133 *> \param[in] LDA
134 *> \verbatim
135 *> LDA is INTEGER
136 *> The leading dimension of the array A. LDA >= max(1,N).
137 *> \endverbatim
138 *>
139 *> \param[in,out] B
140 *> \verbatim
141 *> B is REAL array, dimension(LDB,N)
142 *> On entry, the upper triangular matrix B, with (A, B) in
143 *> generalized real Schur canonical form.
144 *> On exit, B is overwritten by the reordered matrix B.
145 *> \endverbatim
146 *>
147 *> \param[in] LDB
148 *> \verbatim
149 *> LDB is INTEGER
150 *> The leading dimension of the array B. LDB >= max(1,N).
151 *> \endverbatim
152 *>
153 *> \param[out] ALPHAR
154 *> \verbatim
155 *> ALPHAR is REAL array, dimension (N)
156 *> \endverbatim
157 *>
158 *> \param[out] ALPHAI
159 *> \verbatim
160 *> ALPHAI is REAL array, dimension (N)
161 *> \endverbatim
162 *>
163 *> \param[out] BETA
164 *> \verbatim
165 *> BETA is REAL array, dimension (N)
166 *>
167 *> On exit, (ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,N, will
168 *> be the generalized eigenvalues. ALPHAR(j) + ALPHAI(j)*i
169 *> and BETA(j),j=1,...,N are the diagonals of the complex Schur
170 *> form (S,T) that would result if the 2-by-2 diagonal blocks of
171 *> the real generalized Schur form of (A,B) were further reduced
172 *> to triangular form using complex unitary transformations.
173 *> If ALPHAI(j) is zero, then the j-th eigenvalue is real; if
174 *> positive, then the j-th and (j+1)-st eigenvalues are a
175 *> complex conjugate pair, with ALPHAI(j+1) negative.
176 *> \endverbatim
177 *>
178 *> \param[in,out] Q
179 *> \verbatim
180 *> Q is REAL array, dimension (LDQ,N)
181 *> On entry, if WANTQ = .TRUE., Q is an N-by-N matrix.
182 *> On exit, Q has been postmultiplied by the left orthogonal
183 *> transformation matrix which reorder (A, B); The leading M
184 *> columns of Q form orthonormal bases for the specified pair of
185 *> left eigenspaces (deflating subspaces).
186 *> If WANTQ = .FALSE., Q is not referenced.
187 *> \endverbatim
188 *>
189 *> \param[in] LDQ
190 *> \verbatim
191 *> LDQ is INTEGER
192 *> The leading dimension of the array Q. LDQ >= 1;
193 *> and if WANTQ = .TRUE., LDQ >= N.
194 *> \endverbatim
195 *>
196 *> \param[in,out] Z
197 *> \verbatim
198 *> Z is REAL array, dimension (LDZ,N)
199 *> On entry, if WANTZ = .TRUE., Z is an N-by-N matrix.
200 *> On exit, Z has been postmultiplied by the left orthogonal
201 *> transformation matrix which reorder (A, B); The leading M
202 *> columns of Z form orthonormal bases for the specified pair of
203 *> left eigenspaces (deflating subspaces).
204 *> If WANTZ = .FALSE., Z is not referenced.
205 *> \endverbatim
206 *>
207 *> \param[in] LDZ
208 *> \verbatim
209 *> LDZ is INTEGER
210 *> The leading dimension of the array Z. LDZ >= 1;
211 *> If WANTZ = .TRUE., LDZ >= N.
212 *> \endverbatim
213 *>
214 *> \param[out] M
215 *> \verbatim
216 *> M is INTEGER
217 *> The dimension of the specified pair of left and right eigen-
218 *> spaces (deflating subspaces). 0 <= M <= N.
219 *> \endverbatim
220 *>
221 *> \param[out] PL
222 *> \verbatim
223 *> PL is REAL
224 *> \endverbatim
225 *>
226 *> \param[out] PR
227 *> \verbatim
228 *> PR is REAL
229 *>
230 *> If IJOB = 1, 4 or 5, PL, PR are lower bounds on the
231 *> reciprocal of the norm of "projections" onto left and right
232 *> eigenspaces with respect to the selected cluster.
233 *> 0 < PL, PR <= 1.
234 *> If M = 0 or M = N, PL = PR = 1.
235 *> If IJOB = 0, 2 or 3, PL and PR are not referenced.
236 *> \endverbatim
237 *>
238 *> \param[out] DIF
239 *> \verbatim
240 *> DIF is REAL array, dimension (2).
241 *> If IJOB >= 2, DIF(1:2) store the estimates of Difu and Difl.
242 *> If IJOB = 2 or 4, DIF(1:2) are F-norm-based upper bounds on
243 *> Difu and Difl. If IJOB = 3 or 5, DIF(1:2) are 1-norm-based
244 *> estimates of Difu and Difl.
245 *> If M = 0 or N, DIF(1:2) = F-norm([A, B]).
246 *> If IJOB = 0 or 1, DIF is not referenced.
247 *> \endverbatim
248 *>
249 *> \param[out] WORK
250 *> \verbatim
251 *> WORK is REAL array, dimension (MAX(1,LWORK))
252 *> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
253 *> \endverbatim
254 *>
255 *> \param[in] LWORK
256 *> \verbatim
257 *> LWORK is INTEGER
258 *> The dimension of the array WORK. LWORK >= 4*N+16.
259 *> If IJOB = 1, 2 or 4, LWORK >= MAX(4*N+16, 2*M*(N-M)).
260 *> If IJOB = 3 or 5, LWORK >= MAX(4*N+16, 4*M*(N-M)).
261 *>
262 *> If LWORK = -1, then a workspace query is assumed; the routine
263 *> only calculates the optimal size of the WORK array, returns
264 *> this value as the first entry of the WORK array, and no error
265 *> message related to LWORK is issued by XERBLA.
266 *> \endverbatim
267 *>
268 *> \param[out] IWORK
269 *> \verbatim
270 *> IWORK is INTEGER array, dimension (MAX(1,LIWORK))
271 *> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
272 *> \endverbatim
273 *>
274 *> \param[in] LIWORK
275 *> \verbatim
276 *> LIWORK is INTEGER
277 *> The dimension of the array IWORK. LIWORK >= 1.
278 *> If IJOB = 1, 2 or 4, LIWORK >= N+6.
279 *> If IJOB = 3 or 5, LIWORK >= MAX(2*M*(N-M), N+6).
280 *>
281 *> If LIWORK = -1, then a workspace query is assumed; the
282 *> routine only calculates the optimal size of the IWORK array,
283 *> returns this value as the first entry of the IWORK array, and
284 *> no error message related to LIWORK is issued by XERBLA.
285 *> \endverbatim
286 *>
287 *> \param[out] INFO
288 *> \verbatim
289 *> INFO is INTEGER
290 *> =0: Successful exit.
291 *> <0: If INFO = -i, the i-th argument had an illegal value.
292 *> =1: Reordering of (A, B) failed because the transformed
293 *> matrix pair (A, B) would be too far from generalized
294 *> Schur form; the problem is very ill-conditioned.
295 *> (A, B) may have been partially reordered.
296 *> If requested, 0 is returned in DIF(*), PL and PR.
297 *> \endverbatim
298 *
299 * Authors:
300 * ========
301 *
302 *> \author Univ. of Tennessee
303 *> \author Univ. of California Berkeley
304 *> \author Univ. of Colorado Denver
305 *> \author NAG Ltd.
306 *
307 *> \date November 2011
308 *
309 *> \ingroup realOTHERcomputational
310 *
311 *> \par Further Details:
312 * =====================
313 *>
314 *> \verbatim
315 *>
316 *> STGSEN first collects the selected eigenvalues by computing
317 *> orthogonal U and W that move them to the top left corner of (A, B).
318 *> In other words, the selected eigenvalues are the eigenvalues of
319 *> (A11, B11) in:
320 *>
321 *> U**T*(A, B)*W = (A11 A12) (B11 B12) n1
322 *> ( 0 A22),( 0 B22) n2
323 *> n1 n2 n1 n2
324 *>
325 *> where N = n1+n2 and U**T means the transpose of U. The first n1 columns
326 *> of U and W span the specified pair of left and right eigenspaces
327 *> (deflating subspaces) of (A, B).
328 *>
329 *> If (A, B) has been obtained from the generalized real Schur
330 *> decomposition of a matrix pair (C, D) = Q*(A, B)*Z**T, then the
331 *> reordered generalized real Schur form of (C, D) is given by
332 *>
333 *> (C, D) = (Q*U)*(U**T*(A, B)*W)*(Z*W)**T,
334 *>
335 *> and the first n1 columns of Q*U and Z*W span the corresponding
336 *> deflating subspaces of (C, D) (Q and Z store Q*U and Z*W, resp.).
337 *>
338 *> Note that if the selected eigenvalue is sufficiently ill-conditioned,
339 *> then its value may differ significantly from its value before
340 *> reordering.
341 *>
342 *> The reciprocal condition numbers of the left and right eigenspaces
343 *> spanned by the first n1 columns of U and W (or Q*U and Z*W) may
344 *> be returned in DIF(1:2), corresponding to Difu and Difl, resp.
345 *>
346 *> The Difu and Difl are defined as:
347 *>
348 *> Difu[(A11, B11), (A22, B22)] = sigma-min( Zu )
349 *> and
350 *> Difl[(A11, B11), (A22, B22)] = Difu[(A22, B22), (A11, B11)],
351 *>
352 *> where sigma-min(Zu) is the smallest singular value of the
353 *> (2*n1*n2)-by-(2*n1*n2) matrix
354 *>
355 *> Zu = [ kron(In2, A11) -kron(A22**T, In1) ]
356 *> [ kron(In2, B11) -kron(B22**T, In1) ].
357 *>
358 *> Here, Inx is the identity matrix of size nx and A22**T is the
359 *> transpose of A22. kron(X, Y) is the Kronecker product between
360 *> the matrices X and Y.
361 *>
362 *> When DIF(2) is small, small changes in (A, B) can cause large changes
363 *> in the deflating subspace. An approximate (asymptotic) bound on the
364 *> maximum angular error in the computed deflating subspaces is
365 *>
366 *> EPS * norm((A, B)) / DIF(2),
367 *>
368 *> where EPS is the machine precision.
369 *>
370 *> The reciprocal norm of the projectors on the left and right
371 *> eigenspaces associated with (A11, B11) may be returned in PL and PR.
372 *> They are computed as follows. First we compute L and R so that
373 *> P*(A, B)*Q is block diagonal, where
374 *>
375 *> P = ( I -L ) n1 Q = ( I R ) n1
376 *> ( 0 I ) n2 and ( 0 I ) n2
377 *> n1 n2 n1 n2
378 *>
379 *> and (L, R) is the solution to the generalized Sylvester equation
380 *>
381 *> A11*R - L*A22 = -A12
382 *> B11*R - L*B22 = -B12
383 *>
384 *> Then PL = (F-norm(L)**2+1)**(-1/2) and PR = (F-norm(R)**2+1)**(-1/2).
385 *> An approximate (asymptotic) bound on the average absolute error of
386 *> the selected eigenvalues is
387 *>
388 *> EPS * norm((A, B)) / PL.
389 *>
390 *> There are also global error bounds which valid for perturbations up
391 *> to a certain restriction: A lower bound (x) on the smallest
392 *> F-norm(E,F) for which an eigenvalue of (A11, B11) may move and
393 *> coalesce with an eigenvalue of (A22, B22) under perturbation (E,F),
394 *> (i.e. (A + E, B + F), is
395 *>
396 *> x = min(Difu,Difl)/((1/(PL*PL)+1/(PR*PR))**(1/2)+2*max(1/PL,1/PR)).
397 *>
398 *> An approximate bound on x can be computed from DIF(1:2), PL and PR.
399 *>
400 *> If y = ( F-norm(E,F) / x) <= 1, the angles between the perturbed
401 *> (L', R') and unperturbed (L, R) left and right deflating subspaces
402 *> associated with the selected cluster in the (1,1)-blocks can be
403 *> bounded as
404 *>
405 *> max-angle(L, L') <= arctan( y * PL / (1 - y * (1 - PL * PL)**(1/2))
406 *> max-angle(R, R') <= arctan( y * PR / (1 - y * (1 - PR * PR)**(1/2))
407 *>
408 *> See LAPACK User's Guide section 4.11 or the following references
409 *> for more information.
410 *>
411 *> Note that if the default method for computing the Frobenius-norm-
412 *> based estimate DIF is not wanted (see SLATDF), then the parameter
413 *> IDIFJB (see below) should be changed from 3 to 4 (routine SLATDF
414 *> (IJOB = 2 will be used)). See STGSYL for more details.
415 *> \endverbatim
416 *
417 *> \par Contributors:
418 * ==================
419 *>
420 *> Bo Kagstrom and Peter Poromaa, Department of Computing Science,
421 *> Umea University, S-901 87 Umea, Sweden.
422 *
423 *> \par References:
424 * ================
425 *>
426 *> \verbatim
427 *>
428 *> [1] B. Kagstrom; A Direct Method for Reordering Eigenvalues in the
429 *> Generalized Real Schur Form of a Regular Matrix Pair (A, B), in
430 *> M.S. Moonen et al (eds), Linear Algebra for Large Scale and
431 *> Real-Time Applications, Kluwer Academic Publ. 1993, pp 195-218.
432 *>
433 *> [2] B. Kagstrom and P. Poromaa; Computing Eigenspaces with Specified
434 *> Eigenvalues of a Regular Matrix Pair (A, B) and Condition
435 *> Estimation: Theory, Algorithms and Software,
436 *> Report UMINF - 94.04, Department of Computing Science, Umea
437 *> University, S-901 87 Umea, Sweden, 1994. Also as LAPACK Working
438 *> Note 87. To appear in Numerical Algorithms, 1996.
439 *>
440 *> [3] B. Kagstrom and P. Poromaa, LAPACK-Style Algorithms and Software
441 *> for Solving the Generalized Sylvester Equation and Estimating the
442 *> Separation between Regular Matrix Pairs, Report UMINF - 93.23,
443 *> Department of Computing Science, Umea University, S-901 87 Umea,
444 *> Sweden, December 1993, Revised April 1994, Also as LAPACK Working
445 *> Note 75. To appear in ACM Trans. on Math. Software, Vol 22, No 1,
446 *> 1996.
447 *> \endverbatim
448 *>
449 * =====================================================================
450  SUBROUTINE stgsen( IJOB, WANTQ, WANTZ, SELECT, N, A, LDA, B, LDB,
451  $ alphar, alphai, beta, q, ldq, z, ldz, m, pl,
452  $ pr, dif, work, lwork, iwork, liwork, info )
453 *
454 * -- LAPACK computational routine (version 3.4.0) --
455 * -- LAPACK is a software package provided by Univ. of Tennessee, --
456 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
457 * November 2011
458 *
459 * .. Scalar Arguments ..
460  LOGICAL wantq, wantz
461  INTEGER ijob, info, lda, ldb, ldq, ldz, liwork, lwork,
462  $ m, n
463  REAL pl, pr
464 * ..
465 * .. Array Arguments ..
466  LOGICAL select( * )
467  INTEGER iwork( * )
468  REAL a( lda, * ), alphai( * ), alphar( * ),
469  $ b( ldb, * ), beta( * ), dif( * ), q( ldq, * ),
470  $ work( * ), z( ldz, * )
471 * ..
472 *
473 * =====================================================================
474 *
475 * .. Parameters ..
476  INTEGER idifjb
477  parameter( idifjb = 3 )
478  REAL zero, one
479  parameter( zero = 0.0e+0, one = 1.0e+0 )
480 * ..
481 * .. Local Scalars ..
482  LOGICAL lquery, pair, swap, wantd, wantd1, wantd2,
483  $ wantp
484  INTEGER i, ierr, ijb, k, kase, kk, ks, liwmin, lwmin,
485  $ mn2, n1, n2
486  REAL dscale, dsum, eps, rdscal, smlnum
487 * ..
488 * .. Local Arrays ..
489  INTEGER isave( 3 )
490 * ..
491 * .. External Subroutines ..
492  EXTERNAL slacn2, slacpy, slag2, slassq, stgexc, stgsyl,
493  $ xerbla
494 * ..
495 * .. External Functions ..
496  REAL slamch
497  EXTERNAL slamch
498 * ..
499 * .. Intrinsic Functions ..
500  INTRINSIC max, sign, sqrt
501 * ..
502 * .. Executable Statements ..
503 *
504 * Decode and test the input parameters
505 *
506  info = 0
507  lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
508 *
509  IF( ijob.LT.0 .OR. ijob.GT.5 ) THEN
510  info = -1
511  ELSE IF( n.LT.0 ) THEN
512  info = -5
513  ELSE IF( lda.LT.max( 1, n ) ) THEN
514  info = -7
515  ELSE IF( ldb.LT.max( 1, n ) ) THEN
516  info = -9
517  ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) ) THEN
518  info = -14
519  ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) ) THEN
520  info = -16
521  END IF
522 *
523  IF( info.NE.0 ) THEN
524  CALL xerbla( 'STGSEN', -info )
525  return
526  END IF
527 *
528 * Get machine constants
529 *
530  eps = slamch( 'P' )
531  smlnum = slamch( 'S' ) / eps
532  ierr = 0
533 *
534  wantp = ijob.EQ.1 .OR. ijob.GE.4
535  wantd1 = ijob.EQ.2 .OR. ijob.EQ.4
536  wantd2 = ijob.EQ.3 .OR. ijob.EQ.5
537  wantd = wantd1 .OR. wantd2
538 *
539 * Set M to the dimension of the specified pair of deflating
540 * subspaces.
541 *
542  m = 0
543  pair = .false.
544  DO 10 k = 1, n
545  IF( pair ) THEN
546  pair = .false.
547  ELSE
548  IF( k.LT.n ) THEN
549  IF( a( k+1, k ).EQ.zero ) THEN
550  IF( SELECT( k ) )
551  $ m = m + 1
552  ELSE
553  pair = .true.
554  IF( SELECT( k ) .OR. SELECT( k+1 ) )
555  $ m = m + 2
556  END IF
557  ELSE
558  IF( SELECT( n ) )
559  $ m = m + 1
560  END IF
561  END IF
562  10 continue
563 *
564  IF( ijob.EQ.1 .OR. ijob.EQ.2 .OR. ijob.EQ.4 ) THEN
565  lwmin = max( 1, 4*n+16, 2*m*(n-m) )
566  liwmin = max( 1, n+6 )
567  ELSE IF( ijob.EQ.3 .OR. ijob.EQ.5 ) THEN
568  lwmin = max( 1, 4*n+16, 4*m*(n-m) )
569  liwmin = max( 1, 2*m*(n-m), n+6 )
570  ELSE
571  lwmin = max( 1, 4*n+16 )
572  liwmin = 1
573  END IF
574 *
575  work( 1 ) = lwmin
576  iwork( 1 ) = liwmin
577 *
578  IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
579  info = -22
580  ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery ) THEN
581  info = -24
582  END IF
583 *
584  IF( info.NE.0 ) THEN
585  CALL xerbla( 'STGSEN', -info )
586  return
587  ELSE IF( lquery ) THEN
588  return
589  END IF
590 *
591 * Quick return if possible.
592 *
593  IF( m.EQ.n .OR. m.EQ.0 ) THEN
594  IF( wantp ) THEN
595  pl = one
596  pr = one
597  END IF
598  IF( wantd ) THEN
599  dscale = zero
600  dsum = one
601  DO 20 i = 1, n
602  CALL slassq( n, a( 1, i ), 1, dscale, dsum )
603  CALL slassq( n, b( 1, i ), 1, dscale, dsum )
604  20 continue
605  dif( 1 ) = dscale*sqrt( dsum )
606  dif( 2 ) = dif( 1 )
607  END IF
608  go to 60
609  END IF
610 *
611 * Collect the selected blocks at the top-left corner of (A, B).
612 *
613  ks = 0
614  pair = .false.
615  DO 30 k = 1, n
616  IF( pair ) THEN
617  pair = .false.
618  ELSE
619 *
620  swap = SELECT( k )
621  IF( k.LT.n ) THEN
622  IF( a( k+1, k ).NE.zero ) THEN
623  pair = .true.
624  swap = swap .OR. SELECT( k+1 )
625  END IF
626  END IF
627 *
628  IF( swap ) THEN
629  ks = ks + 1
630 *
631 * Swap the K-th block to position KS.
632 * Perform the reordering of diagonal blocks in (A, B)
633 * by orthogonal transformation matrices and update
634 * Q and Z accordingly (if requested):
635 *
636  kk = k
637  IF( k.NE.ks )
638  $ CALL stgexc( wantq, wantz, n, a, lda, b, ldb, q, ldq,
639  $ z, ldz, kk, ks, work, lwork, ierr )
640 *
641  IF( ierr.GT.0 ) THEN
642 *
643 * Swap is rejected: exit.
644 *
645  info = 1
646  IF( wantp ) THEN
647  pl = zero
648  pr = zero
649  END IF
650  IF( wantd ) THEN
651  dif( 1 ) = zero
652  dif( 2 ) = zero
653  END IF
654  go to 60
655  END IF
656 *
657  IF( pair )
658  $ ks = ks + 1
659  END IF
660  END IF
661  30 continue
662  IF( wantp ) THEN
663 *
664 * Solve generalized Sylvester equation for R and L
665 * and compute PL and PR.
666 *
667  n1 = m
668  n2 = n - m
669  i = n1 + 1
670  ijb = 0
671  CALL slacpy( 'Full', n1, n2, a( 1, i ), lda, work, n1 )
672  CALL slacpy( 'Full', n1, n2, b( 1, i ), ldb, work( n1*n2+1 ),
673  $ n1 )
674  CALL stgsyl( 'N', ijb, n1, n2, a, lda, a( i, i ), lda, work,
675  $ n1, b, ldb, b( i, i ), ldb, work( n1*n2+1 ), n1,
676  $ dscale, dif( 1 ), work( n1*n2*2+1 ),
677  $ lwork-2*n1*n2, iwork, ierr )
678 *
679 * Estimate the reciprocal of norms of "projections" onto left
680 * and right eigenspaces.
681 *
682  rdscal = zero
683  dsum = one
684  CALL slassq( n1*n2, work, 1, rdscal, dsum )
685  pl = rdscal*sqrt( dsum )
686  IF( pl.EQ.zero ) THEN
687  pl = one
688  ELSE
689  pl = dscale / ( sqrt( dscale*dscale / pl+pl )*sqrt( pl ) )
690  END IF
691  rdscal = zero
692  dsum = one
693  CALL slassq( n1*n2, work( n1*n2+1 ), 1, rdscal, dsum )
694  pr = rdscal*sqrt( dsum )
695  IF( pr.EQ.zero ) THEN
696  pr = one
697  ELSE
698  pr = dscale / ( sqrt( dscale*dscale / pr+pr )*sqrt( pr ) )
699  END IF
700  END IF
701 *
702  IF( wantd ) THEN
703 *
704 * Compute estimates of Difu and Difl.
705 *
706  IF( wantd1 ) THEN
707  n1 = m
708  n2 = n - m
709  i = n1 + 1
710  ijb = idifjb
711 *
712 * Frobenius norm-based Difu-estimate.
713 *
714  CALL stgsyl( 'N', ijb, n1, n2, a, lda, a( i, i ), lda, work,
715  $ n1, b, ldb, b( i, i ), ldb, work( n1*n2+1 ),
716  $ n1, dscale, dif( 1 ), work( 2*n1*n2+1 ),
717  $ lwork-2*n1*n2, iwork, ierr )
718 *
719 * Frobenius norm-based Difl-estimate.
720 *
721  CALL stgsyl( 'N', ijb, n2, n1, a( i, i ), lda, a, lda, work,
722  $ n2, b( i, i ), ldb, b, ldb, work( n1*n2+1 ),
723  $ n2, dscale, dif( 2 ), work( 2*n1*n2+1 ),
724  $ lwork-2*n1*n2, iwork, ierr )
725  ELSE
726 *
727 *
728 * Compute 1-norm-based estimates of Difu and Difl using
729 * reversed communication with SLACN2. In each step a
730 * generalized Sylvester equation or a transposed variant
731 * is solved.
732 *
733  kase = 0
734  n1 = m
735  n2 = n - m
736  i = n1 + 1
737  ijb = 0
738  mn2 = 2*n1*n2
739 *
740 * 1-norm-based estimate of Difu.
741 *
742  40 continue
743  CALL slacn2( mn2, work( mn2+1 ), work, iwork, dif( 1 ),
744  $ kase, isave )
745  IF( kase.NE.0 ) THEN
746  IF( kase.EQ.1 ) THEN
747 *
748 * Solve generalized Sylvester equation.
749 *
750  CALL stgsyl( 'N', ijb, n1, n2, a, lda, a( i, i ), lda,
751  $ work, n1, b, ldb, b( i, i ), ldb,
752  $ work( n1*n2+1 ), n1, dscale, dif( 1 ),
753  $ work( 2*n1*n2+1 ), lwork-2*n1*n2, iwork,
754  $ ierr )
755  ELSE
756 *
757 * Solve the transposed variant.
758 *
759  CALL stgsyl( 'T', ijb, n1, n2, a, lda, a( i, i ), lda,
760  $ work, n1, b, ldb, b( i, i ), ldb,
761  $ work( n1*n2+1 ), n1, dscale, dif( 1 ),
762  $ work( 2*n1*n2+1 ), lwork-2*n1*n2, iwork,
763  $ ierr )
764  END IF
765  go to 40
766  END IF
767  dif( 1 ) = dscale / dif( 1 )
768 *
769 * 1-norm-based estimate of Difl.
770 *
771  50 continue
772  CALL slacn2( mn2, work( mn2+1 ), work, iwork, dif( 2 ),
773  $ kase, isave )
774  IF( kase.NE.0 ) THEN
775  IF( kase.EQ.1 ) THEN
776 *
777 * Solve generalized Sylvester equation.
778 *
779  CALL stgsyl( 'N', ijb, n2, n1, a( i, i ), lda, a, lda,
780  $ work, n2, b( i, i ), ldb, b, ldb,
781  $ work( n1*n2+1 ), n2, dscale, dif( 2 ),
782  $ work( 2*n1*n2+1 ), lwork-2*n1*n2, iwork,
783  $ ierr )
784  ELSE
785 *
786 * Solve the transposed variant.
787 *
788  CALL stgsyl( 'T', ijb, n2, n1, a( i, i ), lda, a, lda,
789  $ work, n2, b( i, i ), ldb, b, ldb,
790  $ work( n1*n2+1 ), n2, dscale, dif( 2 ),
791  $ work( 2*n1*n2+1 ), lwork-2*n1*n2, iwork,
792  $ ierr )
793  END IF
794  go to 50
795  END IF
796  dif( 2 ) = dscale / dif( 2 )
797 *
798  END IF
799  END IF
800 *
801  60 continue
802 *
803 * Compute generalized eigenvalues of reordered pair (A, B) and
804 * normalize the generalized Schur form.
805 *
806  pair = .false.
807  DO 70 k = 1, n
808  IF( pair ) THEN
809  pair = .false.
810  ELSE
811 *
812  IF( k.LT.n ) THEN
813  IF( a( k+1, k ).NE.zero ) THEN
814  pair = .true.
815  END IF
816  END IF
817 *
818  IF( pair ) THEN
819 *
820 * Compute the eigenvalue(s) at position K.
821 *
822  work( 1 ) = a( k, k )
823  work( 2 ) = a( k+1, k )
824  work( 3 ) = a( k, k+1 )
825  work( 4 ) = a( k+1, k+1 )
826  work( 5 ) = b( k, k )
827  work( 6 ) = b( k+1, k )
828  work( 7 ) = b( k, k+1 )
829  work( 8 ) = b( k+1, k+1 )
830  CALL slag2( work, 2, work( 5 ), 2, smlnum*eps, beta( k ),
831  $ beta( k+1 ), alphar( k ), alphar( k+1 ),
832  $ alphai( k ) )
833  alphai( k+1 ) = -alphai( k )
834 *
835  ELSE
836 *
837  IF( sign( one, b( k, k ) ).LT.zero ) THEN
838 *
839 * If B(K,K) is negative, make it positive
840 *
841  DO 80 i = 1, n
842  a( k, i ) = -a( k, i )
843  b( k, i ) = -b( k, i )
844  IF( wantq ) q( i, k ) = -q( i, k )
845  80 continue
846  END IF
847 *
848  alphar( k ) = a( k, k )
849  alphai( k ) = zero
850  beta( k ) = b( k, k )
851 *
852  END IF
853  END IF
854  70 continue
855 *
856  work( 1 ) = lwmin
857  iwork( 1 ) = liwmin
858 *
859  return
860 *
861 * End of STGSEN
862 *
863  END