3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
9 *> Download ZTGSNA + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ztgsna.f">
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ztgsna.f">
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ztgsna.f">
21 * SUBROUTINE ZTGSNA( JOB, HOWMNY, SELECT, N, A, LDA, B, LDB, VL,
22 * LDVL, VR, LDVR, S, DIF, MM, M, WORK, LWORK,
25 * .. Scalar Arguments ..
26 * CHARACTER HOWMNY, JOB
27 * INTEGER INFO, LDA, LDB, LDVL, LDVR, LWORK, M, MM, N
29 * .. Array Arguments ..
32 * DOUBLE PRECISION DIF( * ), S( * )
33 * COMPLEX*16 A( LDA, * ), B( LDB, * ), VL( LDVL, * ),
34 * $ VR( LDVR, * ), WORK( * )
43 *> ZTGSNA estimates reciprocal condition numbers for specified
44 *> eigenvalues and/or eigenvectors of a matrix pair (A, B).
46 *> (A, B) must be in generalized Schur canonical form, that is, A and
47 *> B are both upper triangular.
56 *> Specifies whether condition numbers are required for
57 *> eigenvalues (S) or eigenvectors (DIF):
58 *> = 'E': for eigenvalues only (S);
59 *> = 'V': for eigenvectors only (DIF);
60 *> = 'B': for both eigenvalues and eigenvectors (S and DIF).
65 *> HOWMNY is CHARACTER*1
66 *> = 'A': compute condition numbers for all eigenpairs;
67 *> = 'S': compute condition numbers for selected eigenpairs
68 *> specified by the array SELECT.
73 *> SELECT is LOGICAL array, dimension (N)
74 *> If HOWMNY = 'S', SELECT specifies the eigenpairs for which
75 *> condition numbers are required. To select condition numbers
76 *> for the corresponding j-th eigenvalue and/or eigenvector,
77 *> SELECT(j) must be set to .TRUE..
78 *> If HOWMNY = 'A', SELECT is not referenced.
84 *> The order of the square matrix pair (A, B). N >= 0.
89 *> A is COMPLEX*16 array, dimension (LDA,N)
90 *> The upper triangular matrix A in the pair (A,B).
96 *> The leading dimension of the array A. LDA >= max(1,N).
101 *> B is COMPLEX*16 array, dimension (LDB,N)
102 *> The upper triangular matrix B in the pair (A, B).
108 *> The leading dimension of the array B. LDB >= max(1,N).
113 *> VL is COMPLEX*16 array, dimension (LDVL,M)
114 *> IF JOB = 'E' or 'B', VL must contain left eigenvectors of
115 *> (A, B), corresponding to the eigenpairs specified by HOWMNY
116 *> and SELECT. The eigenvectors must be stored in consecutive
117 *> columns of VL, as returned by ZTGEVC.
118 *> If JOB = 'V', VL is not referenced.
124 *> The leading dimension of the array VL. LDVL >= 1; and
125 *> If JOB = 'E' or 'B', LDVL >= N.
130 *> VR is COMPLEX*16 array, dimension (LDVR,M)
131 *> IF JOB = 'E' or 'B', VR must contain right eigenvectors of
132 *> (A, B), corresponding to the eigenpairs specified by HOWMNY
133 *> and SELECT. The eigenvectors must be stored in consecutive
134 *> columns of VR, as returned by ZTGEVC.
135 *> If JOB = 'V', VR is not referenced.
141 *> The leading dimension of the array VR. LDVR >= 1;
142 *> If JOB = 'E' or 'B', LDVR >= N.
147 *> S is DOUBLE PRECISION array, dimension (MM)
148 *> If JOB = 'E' or 'B', the reciprocal condition numbers of the
149 *> selected eigenvalues, stored in consecutive elements of the
151 *> If JOB = 'V', S is not referenced.
156 *> DIF is DOUBLE PRECISION array, dimension (MM)
157 *> If JOB = 'V' or 'B', the estimated reciprocal condition
158 *> numbers of the selected eigenvectors, stored in consecutive
159 *> elements of the array.
160 *> If the eigenvalues cannot be reordered to compute DIF(j),
161 *> DIF(j) is set to 0; this can only occur when the true value
162 *> would be very small anyway.
163 *> For each eigenvalue/vector specified by SELECT, DIF stores
164 *> a Frobenius norm-based estimate of Difl.
165 *> If JOB = 'E', DIF is not referenced.
171 *> The number of elements in the arrays S and DIF. MM >= M.
177 *> The number of elements of the arrays S and DIF used to store
178 *> the specified condition numbers; for each selected eigenvalue
179 *> one element is used. If HOWMNY = 'A', M is set to N.
184 *> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK))
185 *> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
191 *> The dimension of the array WORK. LWORK >= max(1,N).
192 *> If JOB = 'V' or 'B', LWORK >= max(1,2*N*N).
197 *> IWORK is INTEGER array, dimension (N+2)
198 *> If JOB = 'E', IWORK is not referenced.
204 *> = 0: Successful exit
205 *> < 0: If INFO = -i, the i-th argument had an illegal value
211 *> \author Univ. of Tennessee
212 *> \author Univ. of California Berkeley
213 *> \author Univ. of Colorado Denver
216 *> \date November 2011
218 *> \ingroup complex16OTHERcomputational
220 *> \par Further Details:
221 * =====================
225 *> The reciprocal of the condition number of the i-th generalized
226 *> eigenvalue w = (a, b) is defined as
228 *> S(I) = (|v**HAu|**2 + |v**HBu|**2)**(1/2) / (norm(u)*norm(v))
230 *> where u and v are the right and left eigenvectors of (A, B)
231 *> corresponding to w; |z| denotes the absolute value of the complex
232 *> number, and norm(u) denotes the 2-norm of the vector u. The pair
233 *> (a, b) corresponds to an eigenvalue w = a/b (= v**HAu/v**HBu) of the
234 *> matrix pair (A, B). If both a and b equal zero, then (A,B) is
235 *> singular and S(I) = -1 is returned.
237 *> An approximate error bound on the chordal distance between the i-th
238 *> computed generalized eigenvalue w and the corresponding exact
239 *> eigenvalue lambda is
241 *> chord(w, lambda) <= EPS * norm(A, B) / S(I),
243 *> where EPS is the machine precision.
245 *> The reciprocal of the condition number of the right eigenvector u
246 *> and left eigenvector v corresponding to the generalized eigenvalue w
247 *> is defined as follows. Suppose
249 *> (A, B) = ( a * ) ( b * ) 1
250 *> ( 0 A22 ),( 0 B22 ) n-1
253 *> Then the reciprocal condition number DIF(I) is
255 *> Difl[(a, b), (A22, B22)] = sigma-min( Zl )
257 *> where sigma-min(Zl) denotes the smallest singular value of
259 *> Zl = [ kron(a, In-1) -kron(1, A22) ]
260 *> [ kron(b, In-1) -kron(1, B22) ].
262 *> Here In-1 is the identity matrix of size n-1 and X**H is the conjugate
263 *> transpose of X. kron(X, Y) is the Kronecker product between the
266 *> We approximate the smallest singular value of Zl with an upper
267 *> bound. This is done by ZLATDF.
269 *> An approximate error bound for a computed eigenvector VL(i) or
272 *> EPS * norm(A, B) / DIF(i).
274 *> See ref. [2-3] for more details and further references.
277 *> \par Contributors:
280 *> Bo Kagstrom and Peter Poromaa, Department of Computing Science,
281 *> Umea University, S-901 87 Umea, Sweden.
288 *> [1] B. Kagstrom; A Direct Method for Reordering Eigenvalues in the
289 *> Generalized Real Schur Form of a Regular Matrix Pair (A, B), in
290 *> M.S. Moonen et al (eds), Linear Algebra for Large Scale and
291 *> Real-Time Applications, Kluwer Academic Publ. 1993, pp 195-218.
293 *> [2] B. Kagstrom and P. Poromaa; Computing Eigenspaces with Specified
294 *> Eigenvalues of a Regular Matrix Pair (A, B) and Condition
295 *> Estimation: Theory, Algorithms and Software, Report
296 *> UMINF - 94.04, Department of Computing Science, Umea University,
297 *> S-901 87 Umea, Sweden, 1994. Also as LAPACK Working Note 87.
298 *> To appear in Numerical Algorithms, 1996.
300 *> [3] B. Kagstrom and P. Poromaa, LAPACK-Style Algorithms and Software
301 *> for Solving the Generalized Sylvester Equation and Estimating the
302 *> Separation between Regular Matrix Pairs, Report UMINF - 93.23,
303 *> Department of Computing Science, Umea University, S-901 87 Umea,
304 *> Sweden, December 1993, Revised April 1994, Also as LAPACK Working
306 *> To appear in ACM Trans. on Math. Software, Vol 22, No 1, 1996.
309 * =====================================================================
310 SUBROUTINE ZTGSNA( JOB, HOWMNY, SELECT, N, A, LDA, B, LDB, VL,
311 $ LDVL, VR, LDVR, S, DIF, MM, M, WORK, LWORK,
314 * -- LAPACK computational routine (version 3.4.0) --
315 * -- LAPACK is a software package provided by Univ. of Tennessee, --
316 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
319 * .. Scalar Arguments ..
320 CHARACTER HOWMNY, JOB
321 INTEGER INFO, LDA, LDB, LDVL, LDVR, LWORK, M, MM, N
323 * .. Array Arguments ..
326 DOUBLE PRECISION DIF( * ), S( * )
327 COMPLEX*16 A( LDA, * ), B( LDB, * ), VL( LDVL, * ),
328 $ VR( LDVR, * ), WORK( * )
331 * =====================================================================
334 DOUBLE PRECISION ZERO, ONE
336 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, IDIFJB = 3 )
338 * .. Local Scalars ..
339 LOGICAL LQUERY, SOMCON, WANTBH, WANTDF, WANTS
340 INTEGER I, IERR, IFST, ILST, K, KS, LWMIN, N1, N2
341 DOUBLE PRECISION BIGNUM, COND, EPS, LNRM, RNRM, SCALE, SMLNUM
342 COMPLEX*16 YHAX, YHBX
345 COMPLEX*16 DUMMY( 1 ), DUMMY1( 1 )
347 * .. External Functions ..
349 DOUBLE PRECISION DLAMCH, DLAPY2, DZNRM2
351 EXTERNAL LSAME, DLAMCH, DLAPY2, DZNRM2, ZDOTC
353 * .. External Subroutines ..
354 EXTERNAL DLABAD, XERBLA, ZGEMV, ZLACPY, ZTGEXC, ZTGSYL
356 * .. Intrinsic Functions ..
357 INTRINSIC ABS, DCMPLX, MAX
359 * .. Executable Statements ..
361 * Decode and test the input parameters
363 WANTBH = LSAME( JOB, 'B' )
364 WANTS = LSAME( JOB, 'E' ) .OR. WANTBH
365 WANTDF = LSAME( JOB, 'V' ) .OR. WANTBH
367 SOMCON = LSAME( HOWMNY, 'S' )
370 LQUERY = ( LWORK.EQ.-1 )
372 IF( .NOT.WANTS .AND. .NOT.WANTDF ) THEN
374 ELSE IF( .NOT.LSAME( HOWMNY, 'A' ) .AND. .NOT.SOMCON ) THEN
376 ELSE IF( N.LT.0 ) THEN
378 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
380 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
382 ELSE IF( WANTS .AND. LDVL.LT.N ) THEN
384 ELSE IF( WANTS .AND. LDVR.LT.N ) THEN
388 * Set M to the number of eigenpairs for which condition numbers
389 * are required, and test MM.
403 ELSE IF( LSAME( JOB, 'V' ) .OR. LSAME( JOB, 'B' ) ) THEN
412 ELSE IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
418 CALL XERBLA( 'ZTGSNA', -INFO )
420 ELSE IF( LQUERY ) THEN
424 * Quick return if possible
429 * Get machine constants
432 SMLNUM = DLAMCH( 'S' ) / EPS
433 BIGNUM = ONE / SMLNUM
434 CALL DLABAD( SMLNUM, BIGNUM )
438 * Determine whether condition numbers are required for the k-th
442 IF( .NOT.SELECT( K ) )
450 * Compute the reciprocal condition number of the k-th
453 RNRM = DZNRM2( N, VR( 1, KS ), 1 )
454 LNRM = DZNRM2( N, VL( 1, KS ), 1 )
455 CALL ZGEMV( 'N', N, N, DCMPLX( ONE, ZERO ), A, LDA,
456 $ VR( 1, KS ), 1, DCMPLX( ZERO, ZERO ), WORK, 1 )
457 YHAX = ZDOTC( N, WORK, 1, VL( 1, KS ), 1 )
458 CALL ZGEMV( 'N', N, N, DCMPLX( ONE, ZERO ), B, LDB,
459 $ VR( 1, KS ), 1, DCMPLX( ZERO, ZERO ), WORK, 1 )
460 YHBX = ZDOTC( N, WORK, 1, VL( 1, KS ), 1 )
461 COND = DLAPY2( ABS( YHAX ), ABS( YHBX ) )
462 IF( COND.EQ.ZERO ) THEN
465 S( KS ) = COND / ( RNRM*LNRM )
471 DIF( KS ) = DLAPY2( ABS( A( 1, 1 ) ), ABS( B( 1, 1 ) ) )
474 * Estimate the reciprocal condition number of the k-th
477 * Copy the matrix (A, B) to the array WORK and move the
478 * (k,k)th pair to the (1,1) position.
480 CALL ZLACPY( 'Full', N, N, A, LDA, WORK, N )
481 CALL ZLACPY( 'Full', N, N, B, LDB, WORK( N*N+1 ), N )
485 CALL ZTGEXC( .FALSE., .FALSE., N, WORK, N, WORK( N*N+1 ),
486 $ N, DUMMY, 1, DUMMY1, 1, IFST, ILST, IERR )
490 * Ill-conditioned problem - swap rejected.
495 * Reordering successful, solve generalized Sylvester
496 * equation for R and L,
497 * A22 * R - L * A11 = A12
498 * B22 * R - L * B11 = B12,
499 * and compute estimate of Difl[(A11,B11), (A22, B22)].
504 CALL ZTGSYL( 'N', IDIFJB, N2, N1, WORK( N*N1+N1+1 ),
505 $ N, WORK, N, WORK( N1+1 ), N,
506 $ WORK( N*N1+N1+I ), N, WORK( I ), N,
507 $ WORK( N1+I ), N, SCALE, DIF( KS ), DUMMY,