LAPACK  3.10.0
LAPACK: Linear Algebra PACKage

◆ sgeevx()

subroutine sgeevx ( character  BALANC,
character  JOBVL,
character  JOBVR,
character  SENSE,
integer  N,
real, dimension( lda, * )  A,
integer  LDA,
real, dimension( * )  WR,
real, dimension( * )  WI,
real, dimension( ldvl, * )  VL,
integer  LDVL,
real, dimension( ldvr, * )  VR,
integer  LDVR,
integer  ILO,
integer  IHI,
real, dimension( * )  SCALE,
real  ABNRM,
real, dimension( * )  RCONDE,
real, dimension( * )  RCONDV,
real, dimension( * )  WORK,
integer  LWORK,
integer, dimension( * )  IWORK,
integer  INFO 
)

SGEEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices

Download SGEEVX + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 SGEEVX computes for an N-by-N real nonsymmetric matrix A, the
 eigenvalues and, optionally, the left and/or right eigenvectors.

 Optionally also, it computes a balancing transformation to improve
 the conditioning of the eigenvalues and eigenvectors (ILO, IHI,
 SCALE, and ABNRM), reciprocal condition numbers for the eigenvalues
 (RCONDE), and reciprocal condition numbers for the right
 eigenvectors (RCONDV).

 The right eigenvector v(j) of A satisfies
                  A * v(j) = lambda(j) * v(j)
 where lambda(j) is its eigenvalue.
 The left eigenvector u(j) of A satisfies
               u(j)**H * A = lambda(j) * u(j)**H
 where u(j)**H denotes the conjugate-transpose of u(j).

 The computed eigenvectors are normalized to have Euclidean norm
 equal to 1 and largest component real.

 Balancing a matrix means permuting the rows and columns to make it
 more nearly upper triangular, and applying a diagonal similarity
 transformation D * A * D**(-1), where D is a diagonal matrix, to
 make its rows and columns closer in norm and the condition numbers
 of its eigenvalues and eigenvectors smaller.  The computed
 reciprocal condition numbers correspond to the balanced matrix.
 Permuting rows and columns will not change the condition numbers
 (in exact arithmetic) but diagonal scaling will.  For further
 explanation of balancing, see section 4.10.2 of the LAPACK
 Users' Guide.
Parameters
[in]BALANC
          BALANC is CHARACTER*1
          Indicates how the input matrix should be diagonally scaled
          and/or permuted to improve the conditioning of its
          eigenvalues.
          = 'N': Do not diagonally scale or permute;
          = 'P': Perform permutations to make the matrix more nearly
                 upper triangular. Do not diagonally scale;
          = 'S': Diagonally scale the matrix, i.e. replace A by
                 D*A*D**(-1), where D is a diagonal matrix chosen
                 to make the rows and columns of A more equal in
                 norm. Do not permute;
          = 'B': Both diagonally scale and permute A.

          Computed reciprocal condition numbers will be for the matrix
          after balancing and/or permuting. Permuting does not change
          condition numbers (in exact arithmetic), but balancing does.
[in]JOBVL
          JOBVL is CHARACTER*1
          = 'N': left eigenvectors of A are not computed;
          = 'V': left eigenvectors of A are computed.
          If SENSE = 'E' or 'B', JOBVL must = 'V'.
[in]JOBVR
          JOBVR is CHARACTER*1
          = 'N': right eigenvectors of A are not computed;
          = 'V': right eigenvectors of A are computed.
          If SENSE = 'E' or 'B', JOBVR must = 'V'.
[in]SENSE
          SENSE is CHARACTER*1
          Determines which reciprocal condition numbers are computed.
          = 'N': None are computed;
          = 'E': Computed for eigenvalues only;
          = 'V': Computed for right eigenvectors only;
          = 'B': Computed for eigenvalues and right eigenvectors.

          If SENSE = 'E' or 'B', both left and right eigenvectors
          must also be computed (JOBVL = 'V' and JOBVR = 'V').
[in]N
          N is INTEGER
          The order of the matrix A. N >= 0.
[in,out]A
          A is REAL array, dimension (LDA,N)
          On entry, the N-by-N matrix A.
          On exit, A has been overwritten.  If JOBVL = 'V' or
          JOBVR = 'V', A contains the real Schur form of the balanced
          version of the input matrix A.
[in]LDA
          LDA is INTEGER
          The leading dimension of the array A.  LDA >= max(1,N).
[out]WR
          WR is REAL array, dimension (N)
[out]WI
          WI is REAL array, dimension (N)
          WR and WI contain the real and imaginary parts,
          respectively, of the computed eigenvalues.  Complex
          conjugate pairs of eigenvalues will appear consecutively
          with the eigenvalue having the positive imaginary part
          first.
[out]VL
          VL is REAL array, dimension (LDVL,N)
          If JOBVL = 'V', the left eigenvectors u(j) are stored one
          after another in the columns of VL, in the same order
          as their eigenvalues.
          If JOBVL = 'N', VL is not referenced.
          If the j-th eigenvalue is real, then u(j) = VL(:,j),
          the j-th column of VL.
          If the j-th and (j+1)-st eigenvalues form a complex
          conjugate pair, then u(j) = VL(:,j) + i*VL(:,j+1) and
          u(j+1) = VL(:,j) - i*VL(:,j+1).
[in]LDVL
          LDVL is INTEGER
          The leading dimension of the array VL.  LDVL >= 1; if
          JOBVL = 'V', LDVL >= N.
[out]VR
          VR is REAL array, dimension (LDVR,N)
          If JOBVR = 'V', the right eigenvectors v(j) are stored one
          after another in the columns of VR, in the same order
          as their eigenvalues.
          If JOBVR = 'N', VR is not referenced.
          If the j-th eigenvalue is real, then v(j) = VR(:,j),
          the j-th column of VR.
          If the j-th and (j+1)-st eigenvalues form a complex
          conjugate pair, then v(j) = VR(:,j) + i*VR(:,j+1) and
          v(j+1) = VR(:,j) - i*VR(:,j+1).
[in]LDVR
          LDVR is INTEGER
          The leading dimension of the array VR.  LDVR >= 1, and if
          JOBVR = 'V', LDVR >= N.
[out]ILO
          ILO is INTEGER
[out]IHI
          IHI is INTEGER
          ILO and IHI are integer values determined when A was
          balanced.  The balanced A(i,j) = 0 if I > J and
          J = 1,...,ILO-1 or I = IHI+1,...,N.
[out]SCALE
          SCALE is REAL array, dimension (N)
          Details of the permutations and scaling factors applied
          when balancing A.  If P(j) is the index of the row and column
          interchanged with row and column j, and D(j) is the scaling
          factor applied to row and column j, then
          SCALE(J) = P(J),    for J = 1,...,ILO-1
                   = D(J),    for J = ILO,...,IHI
                   = P(J)     for J = IHI+1,...,N.
          The order in which the interchanges are made is N to IHI+1,
          then 1 to ILO-1.
[out]ABNRM
          ABNRM is REAL
          The one-norm of the balanced matrix (the maximum
          of the sum of absolute values of elements of any column).
[out]RCONDE
          RCONDE is REAL array, dimension (N)
          RCONDE(j) is the reciprocal condition number of the j-th
          eigenvalue.
[out]RCONDV
          RCONDV is REAL array, dimension (N)
          RCONDV(j) is the reciprocal condition number of the j-th
          right eigenvector.
[out]WORK
          WORK is REAL array, dimension (MAX(1,LWORK))
          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
[in]LWORK
          LWORK is INTEGER
          The dimension of the array WORK.   If SENSE = 'N' or 'E',
          LWORK >= max(1,2*N), and if JOBVL = 'V' or JOBVR = 'V',
          LWORK >= 3*N.  If SENSE = 'V' or 'B', LWORK >= N*(N+6).
          For good performance, LWORK must generally be larger.

          If LWORK = -1, then a workspace query is assumed; the routine
          only calculates the optimal size of the WORK array, returns
          this value as the first entry of the WORK array, and no error
          message related to LWORK is issued by XERBLA.
[out]IWORK
          IWORK is INTEGER array, dimension (2*N-2)
          If SENSE = 'N' or 'E', not referenced.
[out]INFO
          INFO is INTEGER
          = 0:  successful exit
          < 0:  if INFO = -i, the i-th argument had an illegal value.
          > 0:  if INFO = i, the QR algorithm failed to compute all the
                eigenvalues, and no eigenvectors or condition numbers
                have been computed; elements 1:ILO-1 and i+1:N of WR
                and WI contain eigenvalues which have converged.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.

Definition at line 303 of file sgeevx.f.

306  implicit none
307 *
308 * -- LAPACK driver routine --
309 * -- LAPACK is a software package provided by Univ. of Tennessee, --
310 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
311 *
312 * .. Scalar Arguments ..
313  CHARACTER BALANC, JOBVL, JOBVR, SENSE
314  INTEGER IHI, ILO, INFO, LDA, LDVL, LDVR, LWORK, N
315  REAL ABNRM
316 * ..
317 * .. Array Arguments ..
318  INTEGER IWORK( * )
319  REAL A( LDA, * ), RCONDE( * ), RCONDV( * ),
320  $ SCALE( * ), VL( LDVL, * ), VR( LDVR, * ),
321  $ WI( * ), WORK( * ), WR( * )
322 * ..
323 *
324 * =====================================================================
325 *
326 * .. Parameters ..
327  REAL ZERO, ONE
328  parameter( zero = 0.0e0, one = 1.0e0 )
329 * ..
330 * .. Local Scalars ..
331  LOGICAL LQUERY, SCALEA, WANTVL, WANTVR, WNTSNB, WNTSNE,
332  $ WNTSNN, WNTSNV
333  CHARACTER JOB, SIDE
334  INTEGER HSWORK, I, ICOND, IERR, ITAU, IWRK, K,
335  $ LWORK_TREVC, MAXWRK, MINWRK, NOUT
336  REAL ANRM, BIGNUM, CS, CSCALE, EPS, R, SCL, SMLNUM,
337  $ SN
338 * ..
339 * .. Local Arrays ..
340  LOGICAL SELECT( 1 )
341  REAL DUM( 1 )
342 * ..
343 * .. External Subroutines ..
344  EXTERNAL sgebak, sgebal, sgehrd, shseqr, slabad, slacpy,
346  $ strsna, xerbla
347 * ..
348 * .. External Functions ..
349  LOGICAL LSAME
350  INTEGER ISAMAX, ILAENV
351  REAL SLAMCH, SLANGE, SLAPY2, SNRM2
352  EXTERNAL lsame, isamax, ilaenv, slamch, slange, slapy2,
353  $ snrm2
354 * ..
355 * .. Intrinsic Functions ..
356  INTRINSIC max, sqrt
357 * ..
358 * .. Executable Statements ..
359 *
360 * Test the input arguments
361 *
362  info = 0
363  lquery = ( lwork.EQ.-1 )
364  wantvl = lsame( jobvl, 'V' )
365  wantvr = lsame( jobvr, 'V' )
366  wntsnn = lsame( sense, 'N' )
367  wntsne = lsame( sense, 'E' )
368  wntsnv = lsame( sense, 'V' )
369  wntsnb = lsame( sense, 'B' )
370  IF( .NOT.( lsame( balanc, 'N' ) .OR. lsame( balanc, 'S' )
371  $ .OR. lsame( balanc, 'P' ) .OR. lsame( balanc, 'B' ) ) )
372  $ THEN
373  info = -1
374  ELSE IF( ( .NOT.wantvl ) .AND. ( .NOT.lsame( jobvl, 'N' ) ) ) THEN
375  info = -2
376  ELSE IF( ( .NOT.wantvr ) .AND. ( .NOT.lsame( jobvr, 'N' ) ) ) THEN
377  info = -3
378  ELSE IF( .NOT.( wntsnn .OR. wntsne .OR. wntsnb .OR. wntsnv ) .OR.
379  $ ( ( wntsne .OR. wntsnb ) .AND. .NOT.( wantvl .AND.
380  $ wantvr ) ) ) THEN
381  info = -4
382  ELSE IF( n.LT.0 ) THEN
383  info = -5
384  ELSE IF( lda.LT.max( 1, n ) ) THEN
385  info = -7
386  ELSE IF( ldvl.LT.1 .OR. ( wantvl .AND. ldvl.LT.n ) ) THEN
387  info = -11
388  ELSE IF( ldvr.LT.1 .OR. ( wantvr .AND. ldvr.LT.n ) ) THEN
389  info = -13
390  END IF
391 *
392 * Compute workspace
393 * (Note: Comments in the code beginning "Workspace:" describe the
394 * minimal amount of workspace needed at that point in the code,
395 * as well as the preferred amount for good performance.
396 * NB refers to the optimal block size for the immediately
397 * following subroutine, as returned by ILAENV.
398 * HSWORK refers to the workspace preferred by SHSEQR, as
399 * calculated below. HSWORK is computed assuming ILO=1 and IHI=N,
400 * the worst case.)
401 *
402  IF( info.EQ.0 ) THEN
403  IF( n.EQ.0 ) THEN
404  minwrk = 1
405  maxwrk = 1
406  ELSE
407  maxwrk = n + n*ilaenv( 1, 'SGEHRD', ' ', n, 1, n, 0 )
408 *
409  IF( wantvl ) THEN
410  CALL strevc3( 'L', 'B', SELECT, n, a, lda,
411  $ vl, ldvl, vr, ldvr,
412  $ n, nout, work, -1, ierr )
413  lwork_trevc = int( work(1) )
414  maxwrk = max( maxwrk, n + lwork_trevc )
415  CALL shseqr( 'S', 'V', n, 1, n, a, lda, wr, wi, vl, ldvl,
416  $ work, -1, info )
417  ELSE IF( wantvr ) THEN
418  CALL strevc3( 'R', 'B', SELECT, n, a, lda,
419  $ vl, ldvl, vr, ldvr,
420  $ n, nout, work, -1, ierr )
421  lwork_trevc = int( work(1) )
422  maxwrk = max( maxwrk, n + lwork_trevc )
423  CALL shseqr( 'S', 'V', n, 1, n, a, lda, wr, wi, vr, ldvr,
424  $ work, -1, info )
425  ELSE
426  IF( wntsnn ) THEN
427  CALL shseqr( 'E', 'N', n, 1, n, a, lda, wr, wi, vr,
428  $ ldvr, work, -1, info )
429  ELSE
430  CALL shseqr( 'S', 'N', n, 1, n, a, lda, wr, wi, vr,
431  $ ldvr, work, -1, info )
432  END IF
433  END IF
434  hswork = int( work(1) )
435 *
436  IF( ( .NOT.wantvl ) .AND. ( .NOT.wantvr ) ) THEN
437  minwrk = 2*n
438  IF( .NOT.wntsnn )
439  $ minwrk = max( minwrk, n*n+6*n )
440  maxwrk = max( maxwrk, hswork )
441  IF( .NOT.wntsnn )
442  $ maxwrk = max( maxwrk, n*n + 6*n )
443  ELSE
444  minwrk = 3*n
445  IF( ( .NOT.wntsnn ) .AND. ( .NOT.wntsne ) )
446  $ minwrk = max( minwrk, n*n + 6*n )
447  maxwrk = max( maxwrk, hswork )
448  maxwrk = max( maxwrk, n + ( n - 1 )*ilaenv( 1, 'SORGHR',
449  $ ' ', n, 1, n, -1 ) )
450  IF( ( .NOT.wntsnn ) .AND. ( .NOT.wntsne ) )
451  $ maxwrk = max( maxwrk, n*n + 6*n )
452  maxwrk = max( maxwrk, 3*n )
453  END IF
454  maxwrk = max( maxwrk, minwrk )
455  END IF
456  work( 1 ) = maxwrk
457 *
458  IF( lwork.LT.minwrk .AND. .NOT.lquery ) THEN
459  info = -21
460  END IF
461  END IF
462 *
463  IF( info.NE.0 ) THEN
464  CALL xerbla( 'SGEEVX', -info )
465  RETURN
466  ELSE IF( lquery ) THEN
467  RETURN
468  END IF
469 *
470 * Quick return if possible
471 *
472  IF( n.EQ.0 )
473  $ RETURN
474 *
475 * Get machine constants
476 *
477  eps = slamch( 'P' )
478  smlnum = slamch( 'S' )
479  bignum = one / smlnum
480  CALL slabad( smlnum, bignum )
481  smlnum = sqrt( smlnum ) / eps
482  bignum = one / smlnum
483 *
484 * Scale A if max element outside range [SMLNUM,BIGNUM]
485 *
486  icond = 0
487  anrm = slange( 'M', n, n, a, lda, dum )
488  scalea = .false.
489  IF( anrm.GT.zero .AND. anrm.LT.smlnum ) THEN
490  scalea = .true.
491  cscale = smlnum
492  ELSE IF( anrm.GT.bignum ) THEN
493  scalea = .true.
494  cscale = bignum
495  END IF
496  IF( scalea )
497  $ CALL slascl( 'G', 0, 0, anrm, cscale, n, n, a, lda, ierr )
498 *
499 * Balance the matrix and compute ABNRM
500 *
501  CALL sgebal( balanc, n, a, lda, ilo, ihi, scale, ierr )
502  abnrm = slange( '1', n, n, a, lda, dum )
503  IF( scalea ) THEN
504  dum( 1 ) = abnrm
505  CALL slascl( 'G', 0, 0, cscale, anrm, 1, 1, dum, 1, ierr )
506  abnrm = dum( 1 )
507  END IF
508 *
509 * Reduce to upper Hessenberg form
510 * (Workspace: need 2*N, prefer N+N*NB)
511 *
512  itau = 1
513  iwrk = itau + n
514  CALL sgehrd( n, ilo, ihi, a, lda, work( itau ), work( iwrk ),
515  $ lwork-iwrk+1, ierr )
516 *
517  IF( wantvl ) THEN
518 *
519 * Want left eigenvectors
520 * Copy Householder vectors to VL
521 *
522  side = 'L'
523  CALL slacpy( 'L', n, n, a, lda, vl, ldvl )
524 *
525 * Generate orthogonal matrix in VL
526 * (Workspace: need 2*N-1, prefer N+(N-1)*NB)
527 *
528  CALL sorghr( n, ilo, ihi, vl, ldvl, work( itau ), work( iwrk ),
529  $ lwork-iwrk+1, ierr )
530 *
531 * Perform QR iteration, accumulating Schur vectors in VL
532 * (Workspace: need 1, prefer HSWORK (see comments) )
533 *
534  iwrk = itau
535  CALL shseqr( 'S', 'V', n, ilo, ihi, a, lda, wr, wi, vl, ldvl,
536  $ work( iwrk ), lwork-iwrk+1, info )
537 *
538  IF( wantvr ) THEN
539 *
540 * Want left and right eigenvectors
541 * Copy Schur vectors to VR
542 *
543  side = 'B'
544  CALL slacpy( 'F', n, n, vl, ldvl, vr, ldvr )
545  END IF
546 *
547  ELSE IF( wantvr ) THEN
548 *
549 * Want right eigenvectors
550 * Copy Householder vectors to VR
551 *
552  side = 'R'
553  CALL slacpy( 'L', n, n, a, lda, vr, ldvr )
554 *
555 * Generate orthogonal matrix in VR
556 * (Workspace: need 2*N-1, prefer N+(N-1)*NB)
557 *
558  CALL sorghr( n, ilo, ihi, vr, ldvr, work( itau ), work( iwrk ),
559  $ lwork-iwrk+1, ierr )
560 *
561 * Perform QR iteration, accumulating Schur vectors in VR
562 * (Workspace: need 1, prefer HSWORK (see comments) )
563 *
564  iwrk = itau
565  CALL shseqr( 'S', 'V', n, ilo, ihi, a, lda, wr, wi, vr, ldvr,
566  $ work( iwrk ), lwork-iwrk+1, info )
567 *
568  ELSE
569 *
570 * Compute eigenvalues only
571 * If condition numbers desired, compute Schur form
572 *
573  IF( wntsnn ) THEN
574  job = 'E'
575  ELSE
576  job = 'S'
577  END IF
578 *
579 * (Workspace: need 1, prefer HSWORK (see comments) )
580 *
581  iwrk = itau
582  CALL shseqr( job, 'N', n, ilo, ihi, a, lda, wr, wi, vr, ldvr,
583  $ work( iwrk ), lwork-iwrk+1, info )
584  END IF
585 *
586 * If INFO .NE. 0 from SHSEQR, then quit
587 *
588  IF( info.NE.0 )
589  $ GO TO 50
590 *
591  IF( wantvl .OR. wantvr ) THEN
592 *
593 * Compute left and/or right eigenvectors
594 * (Workspace: need 3*N, prefer N + 2*N*NB)
595 *
596  CALL strevc3( side, 'B', SELECT, n, a, lda, vl, ldvl, vr, ldvr,
597  $ n, nout, work( iwrk ), lwork-iwrk+1, ierr )
598  END IF
599 *
600 * Compute condition numbers if desired
601 * (Workspace: need N*N+6*N unless SENSE = 'E')
602 *
603  IF( .NOT.wntsnn ) THEN
604  CALL strsna( sense, 'A', SELECT, n, a, lda, vl, ldvl, vr, ldvr,
605  $ rconde, rcondv, n, nout, work( iwrk ), n, iwork,
606  $ icond )
607  END IF
608 *
609  IF( wantvl ) THEN
610 *
611 * Undo balancing of left eigenvectors
612 *
613  CALL sgebak( balanc, 'L', n, ilo, ihi, scale, n, vl, ldvl,
614  $ ierr )
615 *
616 * Normalize left eigenvectors and make largest component real
617 *
618  DO 20 i = 1, n
619  IF( wi( i ).EQ.zero ) THEN
620  scl = one / snrm2( n, vl( 1, i ), 1 )
621  CALL sscal( n, scl, vl( 1, i ), 1 )
622  ELSE IF( wi( i ).GT.zero ) THEN
623  scl = one / slapy2( snrm2( n, vl( 1, i ), 1 ),
624  $ snrm2( n, vl( 1, i+1 ), 1 ) )
625  CALL sscal( n, scl, vl( 1, i ), 1 )
626  CALL sscal( n, scl, vl( 1, i+1 ), 1 )
627  DO 10 k = 1, n
628  work( k ) = vl( k, i )**2 + vl( k, i+1 )**2
629  10 CONTINUE
630  k = isamax( n, work, 1 )
631  CALL slartg( vl( k, i ), vl( k, i+1 ), cs, sn, r )
632  CALL srot( n, vl( 1, i ), 1, vl( 1, i+1 ), 1, cs, sn )
633  vl( k, i+1 ) = zero
634  END IF
635  20 CONTINUE
636  END IF
637 *
638  IF( wantvr ) THEN
639 *
640 * Undo balancing of right eigenvectors
641 *
642  CALL sgebak( balanc, 'R', n, ilo, ihi, scale, n, vr, ldvr,
643  $ ierr )
644 *
645 * Normalize right eigenvectors and make largest component real
646 *
647  DO 40 i = 1, n
648  IF( wi( i ).EQ.zero ) THEN
649  scl = one / snrm2( n, vr( 1, i ), 1 )
650  CALL sscal( n, scl, vr( 1, i ), 1 )
651  ELSE IF( wi( i ).GT.zero ) THEN
652  scl = one / slapy2( snrm2( n, vr( 1, i ), 1 ),
653  $ snrm2( n, vr( 1, i+1 ), 1 ) )
654  CALL sscal( n, scl, vr( 1, i ), 1 )
655  CALL sscal( n, scl, vr( 1, i+1 ), 1 )
656  DO 30 k = 1, n
657  work( k ) = vr( k, i )**2 + vr( k, i+1 )**2
658  30 CONTINUE
659  k = isamax( n, work, 1 )
660  CALL slartg( vr( k, i ), vr( k, i+1 ), cs, sn, r )
661  CALL srot( n, vr( 1, i ), 1, vr( 1, i+1 ), 1, cs, sn )
662  vr( k, i+1 ) = zero
663  END IF
664  40 CONTINUE
665  END IF
666 *
667 * Undo scaling if necessary
668 *
669  50 CONTINUE
670  IF( scalea ) THEN
671  CALL slascl( 'G', 0, 0, cscale, anrm, n-info, 1, wr( info+1 ),
672  $ max( n-info, 1 ), ierr )
673  CALL slascl( 'G', 0, 0, cscale, anrm, n-info, 1, wi( info+1 ),
674  $ max( n-info, 1 ), ierr )
675  IF( info.EQ.0 ) THEN
676  IF( ( wntsnv .OR. wntsnb ) .AND. icond.EQ.0 )
677  $ CALL slascl( 'G', 0, 0, cscale, anrm, n, 1, rcondv, n,
678  $ ierr )
679  ELSE
680  CALL slascl( 'G', 0, 0, cscale, anrm, ilo-1, 1, wr, n,
681  $ ierr )
682  CALL slascl( 'G', 0, 0, cscale, anrm, ilo-1, 1, wi, n,
683  $ ierr )
684  END IF
685  END IF
686 *
687  work( 1 ) = maxwrk
688  RETURN
689 *
690 * End of SGEEVX
691 *
subroutine slabad(SMALL, LARGE)
SLABAD
Definition: slabad.f:74
subroutine slascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
Definition: slascl.f:143
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
Definition: slacpy.f:103
subroutine slartg(f, g, c, s, r)
SLARTG generates a plane rotation with real cosine and real sine.
Definition: slartg.f90:113
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
ILAENV
Definition: ilaenv.f:162
real function slapy2(X, Y)
SLAPY2 returns sqrt(x2+y2).
Definition: slapy2.f:63
integer function isamax(N, SX, INCX)
ISAMAX
Definition: isamax.f:71
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:53
real function slange(NORM, M, N, A, LDA, WORK)
SLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
Definition: slange.f:114
subroutine sgebal(JOB, N, A, LDA, ILO, IHI, SCALE, INFO)
SGEBAL
Definition: sgebal.f:160
subroutine sgehrd(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
SGEHRD
Definition: sgehrd.f:167
subroutine sgebak(JOB, SIDE, N, ILO, IHI, SCALE, M, V, LDV, INFO)
SGEBAK
Definition: sgebak.f:130
subroutine sorghr(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
SORGHR
Definition: sorghr.f:126
subroutine strevc3(SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, LDVR, MM, M, WORK, LWORK, INFO)
STREVC3
Definition: strevc3.f:237
subroutine strsna(JOB, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, LDVR, S, SEP, MM, M, WORK, LDWORK, IWORK, INFO)
STRSNA
Definition: strsna.f:265
subroutine shseqr(JOB, COMPZ, N, ILO, IHI, H, LDH, WR, WI, Z, LDZ, WORK, LWORK, INFO)
SHSEQR
Definition: shseqr.f:316
subroutine srot(N, SX, INCX, SY, INCY, C, S)
SROT
Definition: srot.f:92
subroutine sscal(N, SA, SX, INCX)
SSCAL
Definition: sscal.f:79
real(wp) function snrm2(n, x, incx)
SNRM2
Definition: snrm2.f90:89
real function slamch(CMACH)
SLAMCH
Definition: slamch.f:68
Here is the call graph for this function:
Here is the caller graph for this function: