LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
dgges3.f
Go to the documentation of this file.
1*> \brief <b> DGGES3 computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE matrices (blocked algorithm)</b>
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> Download DGGES3 + dependencies
9*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dgges3.f">
10*> [TGZ]</a>
11*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dgges3.f">
12*> [ZIP]</a>
13*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dgges3.f">
14*> [TXT]</a>
15*
16* Definition:
17* ===========
18*
19* SUBROUTINE DGGES3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB,
20* SDIM, ALPHAR, ALPHAI, BETA, VSL, LDVSL, VSR,
21* LDVSR, WORK, LWORK, BWORK, INFO )
22*
23* .. Scalar Arguments ..
24* CHARACTER JOBVSL, JOBVSR, SORT
25* INTEGER INFO, LDA, LDB, LDVSL, LDVSR, LWORK, N, SDIM
26* ..
27* .. Array Arguments ..
28* LOGICAL BWORK( * )
29* DOUBLE PRECISION A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
30* $ B( LDB, * ), BETA( * ), VSL( LDVSL, * ),
31* $ VSR( LDVSR, * ), WORK( * )
32* ..
33* .. Function Arguments ..
34* LOGICAL SELCTG
35* EXTERNAL SELCTG
36* ..
37*
38*
39*> \par Purpose:
40* =============
41*>
42*> \verbatim
43*>
44*> DGGES3 computes for a pair of N-by-N real nonsymmetric matrices (A,B),
45*> the generalized eigenvalues, the generalized real Schur form (S,T),
46*> optionally, the left and/or right matrices of Schur vectors (VSL and
47*> VSR). This gives the generalized Schur factorization
48*>
49*> (A,B) = ( (VSL)*S*(VSR)**T, (VSL)*T*(VSR)**T )
50*>
51*> Optionally, it also orders the eigenvalues so that a selected cluster
52*> of eigenvalues appears in the leading diagonal blocks of the upper
53*> quasi-triangular matrix S and the upper triangular matrix T.The
54*> leading columns of VSL and VSR then form an orthonormal basis for the
55*> corresponding left and right eigenspaces (deflating subspaces).
56*>
57*> (If only the generalized eigenvalues are needed, use the driver
58*> DGGEV instead, which is faster.)
59*>
60*> A generalized eigenvalue for a pair of matrices (A,B) is a scalar w
61*> or a ratio alpha/beta = w, such that A - w*B is singular. It is
62*> usually represented as the pair (alpha,beta), as there is a
63*> reasonable interpretation for beta=0 or both being zero.
64*>
65*> A pair of matrices (S,T) is in generalized real Schur form if T is
66*> upper triangular with non-negative diagonal and S is block upper
67*> triangular with 1-by-1 and 2-by-2 blocks. 1-by-1 blocks correspond
68*> to real generalized eigenvalues, while 2-by-2 blocks of S will be
69*> "standardized" by making the corresponding elements of T have the
70*> form:
71*> [ a 0 ]
72*> [ 0 b ]
73*>
74*> and the pair of corresponding 2-by-2 blocks in S and T will have a
75*> complex conjugate pair of generalized eigenvalues.
76*>
77*> \endverbatim
78*
79* Arguments:
80* ==========
81*
82*> \param[in] JOBVSL
83*> \verbatim
84*> JOBVSL is CHARACTER*1
85*> = 'N': do not compute the left Schur vectors;
86*> = 'V': compute the left Schur vectors.
87*> \endverbatim
88*>
89*> \param[in] JOBVSR
90*> \verbatim
91*> JOBVSR is CHARACTER*1
92*> = 'N': do not compute the right Schur vectors;
93*> = 'V': compute the right Schur vectors.
94*> \endverbatim
95*>
96*> \param[in] SORT
97*> \verbatim
98*> SORT is CHARACTER*1
99*> Specifies whether or not to order the eigenvalues on the
100*> diagonal of the generalized Schur form.
101*> = 'N': Eigenvalues are not ordered;
102*> = 'S': Eigenvalues are ordered (see SELCTG);
103*> \endverbatim
104*>
105*> \param[in] SELCTG
106*> \verbatim
107*> SELCTG is a LOGICAL FUNCTION of three DOUBLE PRECISION arguments
108*> SELCTG must be declared EXTERNAL in the calling subroutine.
109*> If SORT = 'N', SELCTG is not referenced.
110*> If SORT = 'S', SELCTG is used to select eigenvalues to sort
111*> to the top left of the Schur form.
112*> An eigenvalue (ALPHAR(j)+ALPHAI(j))/BETA(j) is selected if
113*> SELCTG(ALPHAR(j),ALPHAI(j),BETA(j)) is true; i.e. if either
114*> one of a complex conjugate pair of eigenvalues is selected,
115*> then both complex eigenvalues are selected.
116*>
117*> Note that in the ill-conditioned case, a selected complex
118*> eigenvalue may no longer satisfy SELCTG(ALPHAR(j),ALPHAI(j),
119*> BETA(j)) = .TRUE. after ordering. INFO is to be set to N+2
120*> in this case.
121*> \endverbatim
122*>
123*> \param[in] N
124*> \verbatim
125*> N is INTEGER
126*> The order of the matrices A, B, VSL, and VSR. N >= 0.
127*> \endverbatim
128*>
129*> \param[in,out] A
130*> \verbatim
131*> A is DOUBLE PRECISION array, dimension (LDA, N)
132*> On entry, the first of the pair of matrices.
133*> On exit, A has been overwritten by its generalized Schur
134*> form S.
135*> \endverbatim
136*>
137*> \param[in] LDA
138*> \verbatim
139*> LDA is INTEGER
140*> The leading dimension of A. LDA >= max(1,N).
141*> \endverbatim
142*>
143*> \param[in,out] B
144*> \verbatim
145*> B is DOUBLE PRECISION array, dimension (LDB, N)
146*> On entry, the second of the pair of matrices.
147*> On exit, B has been overwritten by its generalized Schur
148*> form T.
149*> \endverbatim
150*>
151*> \param[in] LDB
152*> \verbatim
153*> LDB is INTEGER
154*> The leading dimension of B. LDB >= max(1,N).
155*> \endverbatim
156*>
157*> \param[out] SDIM
158*> \verbatim
159*> SDIM is INTEGER
160*> If SORT = 'N', SDIM = 0.
161*> If SORT = 'S', SDIM = number of eigenvalues (after sorting)
162*> for which SELCTG is true. (Complex conjugate pairs for which
163*> SELCTG is true for either eigenvalue count as 2.)
164*> \endverbatim
165*>
166*> \param[out] ALPHAR
167*> \verbatim
168*> ALPHAR is DOUBLE PRECISION array, dimension (N)
169*> \endverbatim
170*>
171*> \param[out] ALPHAI
172*> \verbatim
173*> ALPHAI is DOUBLE PRECISION array, dimension (N)
174*> \endverbatim
175*>
176*> \param[out] BETA
177*> \verbatim
178*> BETA is DOUBLE PRECISION array, dimension (N)
179*> On exit, (ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,N, will
180*> be the generalized eigenvalues. ALPHAR(j) + ALPHAI(j)*i,
181*> and BETA(j),j=1,...,N are the diagonals of the complex Schur
182*> form (S,T) that would result if the 2-by-2 diagonal blocks of
183*> the real Schur form of (A,B) were further reduced to
184*> triangular form using 2-by-2 complex unitary transformations.
185*> If ALPHAI(j) is zero, then the j-th eigenvalue is real; if
186*> positive, then the j-th and (j+1)-st eigenvalues are a
187*> complex conjugate pair, with ALPHAI(j+1) negative.
188*>
189*> Note: the quotients ALPHAR(j)/BETA(j) and ALPHAI(j)/BETA(j)
190*> may easily over- or underflow, and BETA(j) may even be zero.
191*> Thus, the user should avoid naively computing the ratio.
192*> However, ALPHAR and ALPHAI will be always less than and
193*> usually comparable with norm(A) in magnitude, and BETA always
194*> less than and usually comparable with norm(B).
195*> \endverbatim
196*>
197*> \param[out] VSL
198*> \verbatim
199*> VSL is DOUBLE PRECISION array, dimension (LDVSL,N)
200*> If JOBVSL = 'V', VSL will contain the left Schur vectors.
201*> Not referenced if JOBVSL = 'N'.
202*> \endverbatim
203*>
204*> \param[in] LDVSL
205*> \verbatim
206*> LDVSL is INTEGER
207*> The leading dimension of the matrix VSL. LDVSL >=1, and
208*> if JOBVSL = 'V', LDVSL >= N.
209*> \endverbatim
210*>
211*> \param[out] VSR
212*> \verbatim
213*> VSR is DOUBLE PRECISION array, dimension (LDVSR,N)
214*> If JOBVSR = 'V', VSR will contain the right Schur vectors.
215*> Not referenced if JOBVSR = 'N'.
216*> \endverbatim
217*>
218*> \param[in] LDVSR
219*> \verbatim
220*> LDVSR is INTEGER
221*> The leading dimension of the matrix VSR. LDVSR >= 1, and
222*> if JOBVSR = 'V', LDVSR >= N.
223*> \endverbatim
224*>
225*> \param[out] WORK
226*> \verbatim
227*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
228*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
229*> \endverbatim
230*>
231*> \param[in] LWORK
232*> \verbatim
233*> LWORK is INTEGER
234*> The dimension of the array WORK.
235*> If N = 0, LWORK >= 1, else LWORK >= 6*N+16.
236*> For good performance, LWORK must generally be larger.
237*>
238*> If LWORK = -1, then a workspace query is assumed; the routine
239*> only calculates the optimal size of the WORK array, returns
240*> this value as the first entry of the WORK array, and no error
241*> message related to LWORK is issued by XERBLA.
242*> \endverbatim
243*>
244*> \param[out] BWORK
245*> \verbatim
246*> BWORK is LOGICAL array, dimension (N)
247*> Not referenced if SORT = 'N'.
248*> \endverbatim
249*>
250*> \param[out] INFO
251*> \verbatim
252*> INFO is INTEGER
253*> = 0: successful exit
254*> < 0: if INFO = -i, the i-th argument had an illegal value.
255*> = 1,...,N:
256*> The QZ iteration failed. (A,B) are not in Schur
257*> form, but ALPHAR(j), ALPHAI(j), and BETA(j) should
258*> be correct for j=INFO+1,...,N.
259*> > N: =N+1: other than QZ iteration failed in DLAQZ0.
260*> =N+2: after reordering, roundoff changed values of
261*> some complex eigenvalues so that leading
262*> eigenvalues in the Generalized Schur form no
263*> longer satisfy SELCTG=.TRUE. This could also
264*> be caused due to scaling.
265*> =N+3: reordering failed in DTGSEN.
266*> \endverbatim
267*
268* Authors:
269* ========
270*
271*> \author Univ. of Tennessee
272*> \author Univ. of California Berkeley
273*> \author Univ. of Colorado Denver
274*> \author NAG Ltd.
275*
276*> \ingroup gges3
277*
278* =====================================================================
279 SUBROUTINE dgges3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
280 $ LDB, SDIM, ALPHAR, ALPHAI, BETA, VSL, LDVSL,
281 $ VSR, LDVSR, WORK, LWORK, BWORK, INFO )
282*
283* -- LAPACK driver routine --
284* -- LAPACK is a software package provided by Univ. of Tennessee, --
285* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
286*
287* .. Scalar Arguments ..
288 CHARACTER JOBVSL, JOBVSR, SORT
289 INTEGER INFO, LDA, LDB, LDVSL, LDVSR, LWORK, N, SDIM
290* ..
291* .. Array Arguments ..
292 LOGICAL BWORK( * )
293 DOUBLE PRECISION A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
294 $ b( ldb, * ), beta( * ), vsl( ldvsl, * ),
295 $ vsr( ldvsr, * ), work( * )
296* ..
297* .. Function Arguments ..
298 LOGICAL SELCTG
299 EXTERNAL SELCTG
300* ..
301*
302* =====================================================================
303*
304* .. Parameters ..
305 DOUBLE PRECISION ZERO, ONE
306 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
307* ..
308* .. Local Scalars ..
309 LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
310 $ LQUERY, LST2SL, WANTST
311 INTEGER I, ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT,
312 $ ILO, IP, IRIGHT, IROWS, ITAU, IWRK, LWKOPT,
313 $ lwkmin
314 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PVSL,
315 $ PVSR, SAFMAX, SAFMIN, SMLNUM
316* ..
317* .. Local Arrays ..
318 INTEGER IDUM( 1 )
319 DOUBLE PRECISION DIF( 2 )
320* ..
321* .. External Subroutines ..
322 EXTERNAL dgeqrf, dggbak, dggbal, dgghd3, dlaqz0,
323 $ dlacpy,
325* ..
326* .. External Functions ..
327 LOGICAL LSAME
328 DOUBLE PRECISION DLAMCH, DLANGE
329 EXTERNAL lsame, dlamch, dlange
330* ..
331* .. Intrinsic Functions ..
332 INTRINSIC abs, max, sqrt
333* ..
334* .. Executable Statements ..
335*
336* Decode the input arguments
337*
338 IF( lsame( jobvsl, 'N' ) ) THEN
339 ijobvl = 1
340 ilvsl = .false.
341 ELSE IF( lsame( jobvsl, 'V' ) ) THEN
342 ijobvl = 2
343 ilvsl = .true.
344 ELSE
345 ijobvl = -1
346 ilvsl = .false.
347 END IF
348*
349 IF( lsame( jobvsr, 'N' ) ) THEN
350 ijobvr = 1
351 ilvsr = .false.
352 ELSE IF( lsame( jobvsr, 'V' ) ) THEN
353 ijobvr = 2
354 ilvsr = .true.
355 ELSE
356 ijobvr = -1
357 ilvsr = .false.
358 END IF
359*
360 wantst = lsame( sort, 'S' )
361*
362* Test the input arguments
363*
364 info = 0
365 lquery = ( lwork.EQ.-1 )
366 IF( n.EQ.0 ) THEN
367 lwkmin = 1
368 ELSE
369 lwkmin = 6*n+16
370 END IF
371*
372 IF( ijobvl.LE.0 ) THEN
373 info = -1
374 ELSE IF( ijobvr.LE.0 ) THEN
375 info = -2
376 ELSE IF( ( .NOT.wantst ) .AND.
377 $ ( .NOT.lsame( sort, 'N' ) ) ) THEN
378 info = -3
379 ELSE IF( n.LT.0 ) THEN
380 info = -5
381 ELSE IF( lda.LT.max( 1, n ) ) THEN
382 info = -7
383 ELSE IF( ldb.LT.max( 1, n ) ) THEN
384 info = -9
385 ELSE IF( ldvsl.LT.1 .OR. ( ilvsl .AND. ldvsl.LT.n ) ) THEN
386 info = -15
387 ELSE IF( ldvsr.LT.1 .OR. ( ilvsr .AND. ldvsr.LT.n ) ) THEN
388 info = -17
389 ELSE IF( lwork.LT.lwkmin .AND. .NOT.lquery ) THEN
390 info = -19
391 END IF
392*
393* Compute workspace
394*
395 IF( info.EQ.0 ) THEN
396 CALL dgeqrf( n, n, b, ldb, work, work, -1, ierr )
397 lwkopt = max( lwkmin, 3*n+int( work( 1 ) ) )
398 CALL dormqr( 'L', 'T', n, n, n, b, ldb, work, a, lda, work,
399 $ -1, ierr )
400 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
401 IF( ilvsl ) THEN
402 CALL dorgqr( n, n, n, vsl, ldvsl, work, work, -1, ierr )
403 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
404 END IF
405 CALL dgghd3( jobvsl, jobvsr, n, 1, n, a, lda, b, ldb, vsl,
406 $ ldvsl, vsr, ldvsr, work, -1, ierr )
407 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
408 CALL dlaqz0( 'S', jobvsl, jobvsr, n, 1, n, a, lda, b, ldb,
409 $ alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr,
410 $ work, -1, 0, ierr )
411 lwkopt = max( lwkopt, 2*n+int( work( 1 ) ) )
412 IF( wantst ) THEN
413 CALL dtgsen( 0, ilvsl, ilvsr, bwork, n, a, lda, b, ldb,
414 $ alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr,
415 $ sdim, pvsl, pvsr, dif, work, -1, idum, 1,
416 $ ierr )
417 lwkopt = max( lwkopt, 2*n+int( work( 1 ) ) )
418 END IF
419 IF( n.EQ.0 ) THEN
420 work( 1 ) = 1
421 ELSE
422 work( 1 ) = lwkopt
423 END IF
424 END IF
425*
426 IF( info.NE.0 ) THEN
427 CALL xerbla( 'DGGES3 ', -info )
428 RETURN
429 ELSE IF( lquery ) THEN
430 RETURN
431 END IF
432*
433* Quick return if possible
434*
435 IF( n.EQ.0 ) THEN
436 sdim = 0
437 RETURN
438 END IF
439*
440* Get machine constants
441*
442 eps = dlamch( 'P' )
443 safmin = dlamch( 'S' )
444 safmax = one / safmin
445 smlnum = sqrt( safmin ) / eps
446 bignum = one / smlnum
447*
448* Scale A if max element outside range [SMLNUM,BIGNUM]
449*
450 anrm = dlange( 'M', n, n, a, lda, work )
451 ilascl = .false.
452 IF( anrm.GT.zero .AND. anrm.LT.smlnum ) THEN
453 anrmto = smlnum
454 ilascl = .true.
455 ELSE IF( anrm.GT.bignum ) THEN
456 anrmto = bignum
457 ilascl = .true.
458 END IF
459 IF( ilascl )
460 $ CALL dlascl( 'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
461*
462* Scale B if max element outside range [SMLNUM,BIGNUM]
463*
464 bnrm = dlange( 'M', n, n, b, ldb, work )
465 ilbscl = .false.
466 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum ) THEN
467 bnrmto = smlnum
468 ilbscl = .true.
469 ELSE IF( bnrm.GT.bignum ) THEN
470 bnrmto = bignum
471 ilbscl = .true.
472 END IF
473 IF( ilbscl )
474 $ CALL dlascl( 'G', 0, 0, bnrm, bnrmto, n, n, b, ldb, ierr )
475*
476* Permute the matrix to make it more nearly triangular
477*
478 ileft = 1
479 iright = n + 1
480 iwrk = iright + n
481 CALL dggbal( 'P', n, a, lda, b, ldb, ilo, ihi, work( ileft ),
482 $ work( iright ), work( iwrk ), ierr )
483*
484* Reduce B to triangular form (QR decomposition of B)
485*
486 irows = ihi + 1 - ilo
487 icols = n + 1 - ilo
488 itau = iwrk
489 iwrk = itau + irows
490 CALL dgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
491 $ work( iwrk ), lwork+1-iwrk, ierr )
492*
493* Apply the orthogonal transformation to matrix A
494*
495 CALL dormqr( 'L', 'T', irows, icols, irows, b( ilo, ilo ), ldb,
496 $ work( itau ), a( ilo, ilo ), lda, work( iwrk ),
497 $ lwork+1-iwrk, ierr )
498*
499* Initialize VSL
500*
501 IF( ilvsl ) THEN
502 CALL dlaset( 'Full', n, n, zero, one, vsl, ldvsl )
503 IF( irows.GT.1 ) THEN
504 CALL dlacpy( 'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
505 $ vsl( ilo+1, ilo ), ldvsl )
506 END IF
507 CALL dorgqr( irows, irows, irows, vsl( ilo, ilo ), ldvsl,
508 $ work( itau ), work( iwrk ), lwork+1-iwrk, ierr )
509 END IF
510*
511* Initialize VSR
512*
513 IF( ilvsr )
514 $ CALL dlaset( 'Full', n, n, zero, one, vsr, ldvsr )
515*
516* Reduce to generalized Hessenberg form
517*
518 CALL dgghd3( jobvsl, jobvsr, n, ilo, ihi, a, lda, b, ldb, vsl,
519 $ ldvsl, vsr, ldvsr, work( iwrk ), lwork+1-iwrk,
520 $ ierr )
521*
522* Perform QZ algorithm, computing Schur vectors if desired
523*
524 iwrk = itau
525 CALL dlaqz0( 'S', jobvsl, jobvsr, n, ilo, ihi, a, lda, b, ldb,
526 $ alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr,
527 $ work( iwrk ), lwork+1-iwrk, 0, ierr )
528 IF( ierr.NE.0 ) THEN
529 IF( ierr.GT.0 .AND. ierr.LE.n ) THEN
530 info = ierr
531 ELSE IF( ierr.GT.n .AND. ierr.LE.2*n ) THEN
532 info = ierr - n
533 ELSE
534 info = n + 1
535 END IF
536 GO TO 50
537 END IF
538*
539* Sort eigenvalues ALPHA/BETA if desired
540*
541 sdim = 0
542 IF( wantst ) THEN
543*
544* Undo scaling on eigenvalues before SELCTGing
545*
546 IF( ilascl ) THEN
547 CALL dlascl( 'G', 0, 0, anrmto, anrm, n, 1, alphar, n,
548 $ ierr )
549 CALL dlascl( 'G', 0, 0, anrmto, anrm, n, 1, alphai, n,
550 $ ierr )
551 END IF
552 IF( ilbscl )
553 $ CALL dlascl( 'G', 0, 0, bnrmto, bnrm, n, 1, beta, n,
554 $ ierr )
555*
556* Select eigenvalues
557*
558 DO 10 i = 1, n
559 bwork( i ) = selctg( alphar( i ), alphai( i ),
560 $ beta( i ) )
561 10 CONTINUE
562*
563 CALL dtgsen( 0, ilvsl, ilvsr, bwork, n, a, lda, b, ldb,
564 $ alphar,
565 $ alphai, beta, vsl, ldvsl, vsr, ldvsr, sdim, pvsl,
566 $ pvsr, dif, work( iwrk ), lwork-iwrk+1, idum, 1,
567 $ ierr )
568 IF( ierr.EQ.1 )
569 $ info = n + 3
570*
571 END IF
572*
573* Apply back-permutation to VSL and VSR
574*
575 IF( ilvsl )
576 $ CALL dggbak( 'P', 'L', n, ilo, ihi, work( ileft ),
577 $ work( iright ), n, vsl, ldvsl, ierr )
578*
579 IF( ilvsr )
580 $ CALL dggbak( 'P', 'R', n, ilo, ihi, work( ileft ),
581 $ work( iright ), n, vsr, ldvsr, ierr )
582*
583* Check if unscaling would cause over/underflow, if so, rescale
584* (ALPHAR(I),ALPHAI(I),BETA(I)) so BETA(I) is on the order of
585* B(I,I) and ALPHAR(I) and ALPHAI(I) are on the order of A(I,I)
586*
587 IF( ilascl ) THEN
588 DO 20 i = 1, n
589 IF( alphai( i ).NE.zero ) THEN
590 IF( ( alphar( i ) / safmax ).GT.( anrmto / anrm ) .OR.
591 $ ( safmin / alphar( i ) ).GT.( anrm / anrmto ) ) THEN
592 work( 1 ) = abs( a( i, i ) / alphar( i ) )
593 beta( i ) = beta( i )*work( 1 )
594 alphar( i ) = alphar( i )*work( 1 )
595 alphai( i ) = alphai( i )*work( 1 )
596 ELSE IF( ( alphai( i ) / safmax ).GT.
597 $ ( anrmto / anrm ) .OR.
598 $ ( safmin / alphai( i ) ).GT.( anrm / anrmto ) )
599 $ THEN
600 work( 1 ) = abs( a( i, i+1 ) / alphai( i ) )
601 beta( i ) = beta( i )*work( 1 )
602 alphar( i ) = alphar( i )*work( 1 )
603 alphai( i ) = alphai( i )*work( 1 )
604 END IF
605 END IF
606 20 CONTINUE
607 END IF
608*
609 IF( ilbscl ) THEN
610 DO 30 i = 1, n
611 IF( alphai( i ).NE.zero ) THEN
612 IF( ( beta( i ) / safmax ).GT.( bnrmto / bnrm ) .OR.
613 $ ( safmin / beta( i ) ).GT.( bnrm / bnrmto ) ) THEN
614 work( 1 ) = abs( b( i, i ) / beta( i ) )
615 beta( i ) = beta( i )*work( 1 )
616 alphar( i ) = alphar( i )*work( 1 )
617 alphai( i ) = alphai( i )*work( 1 )
618 END IF
619 END IF
620 30 CONTINUE
621 END IF
622*
623* Undo scaling
624*
625 IF( ilascl ) THEN
626 CALL dlascl( 'H', 0, 0, anrmto, anrm, n, n, a, lda, ierr )
627 CALL dlascl( 'G', 0, 0, anrmto, anrm, n, 1, alphar, n,
628 $ ierr )
629 CALL dlascl( 'G', 0, 0, anrmto, anrm, n, 1, alphai, n,
630 $ ierr )
631 END IF
632*
633 IF( ilbscl ) THEN
634 CALL dlascl( 'U', 0, 0, bnrmto, bnrm, n, n, b, ldb, ierr )
635 CALL dlascl( 'G', 0, 0, bnrmto, bnrm, n, 1, beta, n, ierr )
636 END IF
637*
638 IF( wantst ) THEN
639*
640* Check if reordering is correct
641*
642 lastsl = .true.
643 lst2sl = .true.
644 sdim = 0
645 ip = 0
646 DO 40 i = 1, n
647 cursl = selctg( alphar( i ), alphai( i ), beta( i ) )
648 IF( alphai( i ).EQ.zero ) THEN
649 IF( cursl )
650 $ sdim = sdim + 1
651 ip = 0
652 IF( cursl .AND. .NOT.lastsl )
653 $ info = n + 2
654 ELSE
655 IF( ip.EQ.1 ) THEN
656*
657* Last eigenvalue of conjugate pair
658*
659 cursl = cursl .OR. lastsl
660 lastsl = cursl
661 IF( cursl )
662 $ sdim = sdim + 2
663 ip = -1
664 IF( cursl .AND. .NOT.lst2sl )
665 $ info = n + 2
666 ELSE
667*
668* First eigenvalue of conjugate pair
669*
670 ip = 1
671 END IF
672 END IF
673 lst2sl = lastsl
674 lastsl = cursl
675 40 CONTINUE
676*
677 END IF
678*
679 50 CONTINUE
680*
681 work( 1 ) = lwkopt
682*
683 RETURN
684*
685* End of DGGES3
686*
687 END
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine dgeqrf(m, n, a, lda, tau, work, lwork, info)
DGEQRF
Definition dgeqrf.f:144
subroutine dggbak(job, side, n, ilo, ihi, lscale, rscale, m, v, ldv, info)
DGGBAK
Definition dggbak.f:146
subroutine dggbal(job, n, a, lda, b, ldb, ilo, ihi, lscale, rscale, work, info)
DGGBAL
Definition dggbal.f:175
subroutine dgges3(jobvsl, jobvsr, sort, selctg, n, a, lda, b, ldb, sdim, alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, bwork, info)
DGGES3 computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE ...
Definition dgges3.f:282
subroutine dgghd3(compq, compz, n, ilo, ihi, a, lda, b, ldb, q, ldq, z, ldz, work, lwork, info)
DGGHD3
Definition dgghd3.f:229
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
Definition dlacpy.f:101
recursive subroutine dlaqz0(wants, wantq, wantz, n, ilo, ihi, a, lda, b, ldb, alphar, alphai, beta, q, ldq, z, ldz, work, lwork, rec, info)
DLAQZ0
Definition dlaqz0.f:305
subroutine dlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
Definition dlascl.f:142
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
Definition dlaset.f:108
subroutine dtgsen(ijob, wantq, wantz, select, n, a, lda, b, ldb, alphar, alphai, beta, q, ldq, z, ldz, m, pl, pr, dif, work, lwork, iwork, liwork, info)
DTGSEN
Definition dtgsen.f:450
subroutine dorgqr(m, n, k, a, lda, tau, work, lwork, info)
DORGQR
Definition dorgqr.f:126
subroutine dormqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
DORMQR
Definition dormqr.f:165