File:  [local] / rpl / lapack / lapack / zgegs.f
Revision 1.17: download - view: text, annotated - select for diffs - revision graph
Mon Aug 7 08:39:16 2023 UTC (8 months, 3 weeks ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_35, rpl-4_1_34, HEAD
Première mise à jour de lapack et blas.

    1: *> \brief <b> ZGEEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices</b>
    2: *
    3: *  =========== DOCUMENTATION ===========
    4: *
    5: * Online html documentation available at
    6: *            http://www.netlib.org/lapack/explore-html/
    7: *
    8: *> \htmlonly
    9: *> Download ZGEGS + dependencies
   10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zgegs.f">
   11: *> [TGZ]</a>
   12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zgegs.f">
   13: *> [ZIP]</a>
   14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zgegs.f">
   15: *> [TXT]</a>
   16: *> \endhtmlonly
   17: *
   18: *  Definition:
   19: *  ===========
   20: *
   21: *       SUBROUTINE ZGEGS( JOBVSL, JOBVSR, N, A, LDA, B, LDB, ALPHA, BETA,
   22: *                         VSL, LDVSL, VSR, LDVSR, WORK, LWORK, RWORK,
   23: *                         INFO )
   24: *
   25: *       .. Scalar Arguments ..
   26: *       CHARACTER          JOBVSL, JOBVSR
   27: *       INTEGER            INFO, LDA, LDB, LDVSL, LDVSR, LWORK, N
   28: *       ..
   29: *       .. Array Arguments ..
   30: *       DOUBLE PRECISION   RWORK( * )
   31: *       COMPLEX*16         A( LDA, * ), ALPHA( * ), B( LDB, * ),
   32: *      $                   BETA( * ), VSL( LDVSL, * ), VSR( LDVSR, * ),
   33: *      $                   WORK( * )
   34: *       ..
   35: *
   36: *
   37: *> \par Purpose:
   38: *  =============
   39: *>
   40: *> \verbatim
   41: *>
   42: *> This routine is deprecated and has been replaced by routine ZGGES.
   43: *>
   44: *> ZGEGS computes the eigenvalues, Schur form, and, optionally, the
   45: *> left and or/right Schur vectors of a complex matrix pair (A,B).
   46: *> Given two square matrices A and B, the generalized Schur
   47: *> factorization has the form
   48: *>
   49: *>    A = Q*S*Z**H,  B = Q*T*Z**H
   50: *>
   51: *> where Q and Z are unitary matrices and S and T are upper triangular.
   52: *> The columns of Q are the left Schur vectors
   53: *> and the columns of Z are the right Schur vectors.
   54: *>
   55: *> If only the eigenvalues of (A,B) are needed, the driver routine
   56: *> ZGEGV should be used instead.  See ZGEGV for a description of the
   57: *> eigenvalues of the generalized nonsymmetric eigenvalue problem
   58: *> (GNEP).
   59: *> \endverbatim
   60: *
   61: *  Arguments:
   62: *  ==========
   63: *
   64: *> \param[in] JOBVSL
   65: *> \verbatim
   66: *>          JOBVSL is CHARACTER*1
   67: *>          = 'N':  do not compute the left Schur vectors;
   68: *>          = 'V':  compute the left Schur vectors (returned in VSL).
   69: *> \endverbatim
   70: *>
   71: *> \param[in] JOBVSR
   72: *> \verbatim
   73: *>          JOBVSR is CHARACTER*1
   74: *>          = 'N':  do not compute the right Schur vectors;
   75: *>          = 'V':  compute the right Schur vectors (returned in VSR).
   76: *> \endverbatim
   77: *>
   78: *> \param[in] N
   79: *> \verbatim
   80: *>          N is INTEGER
   81: *>          The order of the matrices A, B, VSL, and VSR.  N >= 0.
   82: *> \endverbatim
   83: *>
   84: *> \param[in,out] A
   85: *> \verbatim
   86: *>          A is COMPLEX*16 array, dimension (LDA, N)
   87: *>          On entry, the matrix A.
   88: *>          On exit, the upper triangular matrix S from the generalized
   89: *>          Schur factorization.
   90: *> \endverbatim
   91: *>
   92: *> \param[in] LDA
   93: *> \verbatim
   94: *>          LDA is INTEGER
   95: *>          The leading dimension of A.  LDA >= max(1,N).
   96: *> \endverbatim
   97: *>
   98: *> \param[in,out] B
   99: *> \verbatim
  100: *>          B is COMPLEX*16 array, dimension (LDB, N)
  101: *>          On entry, the matrix B.
  102: *>          On exit, the upper triangular matrix T from the generalized
  103: *>          Schur factorization.
  104: *> \endverbatim
  105: *>
  106: *> \param[in] LDB
  107: *> \verbatim
  108: *>          LDB is INTEGER
  109: *>          The leading dimension of B.  LDB >= max(1,N).
  110: *> \endverbatim
  111: *>
  112: *> \param[out] ALPHA
  113: *> \verbatim
  114: *>          ALPHA is COMPLEX*16 array, dimension (N)
  115: *>          The complex scalars alpha that define the eigenvalues of
  116: *>          GNEP.  ALPHA(j) = S(j,j), the diagonal element of the Schur
  117: *>          form of A.
  118: *> \endverbatim
  119: *>
  120: *> \param[out] BETA
  121: *> \verbatim
  122: *>          BETA is COMPLEX*16 array, dimension (N)
  123: *>          The non-negative real scalars beta that define the
  124: *>          eigenvalues of GNEP.  BETA(j) = T(j,j), the diagonal element
  125: *>          of the triangular factor T.
  126: *>
  127: *>          Together, the quantities alpha = ALPHA(j) and beta = BETA(j)
  128: *>          represent the j-th eigenvalue of the matrix pair (A,B), in
  129: *>          one of the forms lambda = alpha/beta or mu = beta/alpha.
  130: *>          Since either lambda or mu may overflow, they should not,
  131: *>          in general, be computed.
  132: *> \endverbatim
  133: *>
  134: *> \param[out] VSL
  135: *> \verbatim
  136: *>          VSL is COMPLEX*16 array, dimension (LDVSL,N)
  137: *>          If JOBVSL = 'V', the matrix of left Schur vectors Q.
  138: *>          Not referenced if JOBVSL = 'N'.
  139: *> \endverbatim
  140: *>
  141: *> \param[in] LDVSL
  142: *> \verbatim
  143: *>          LDVSL is INTEGER
  144: *>          The leading dimension of the matrix VSL. LDVSL >= 1, and
  145: *>          if JOBVSL = 'V', LDVSL >= N.
  146: *> \endverbatim
  147: *>
  148: *> \param[out] VSR
  149: *> \verbatim
  150: *>          VSR is COMPLEX*16 array, dimension (LDVSR,N)
  151: *>          If JOBVSR = 'V', the matrix of right Schur vectors Z.
  152: *>          Not referenced if JOBVSR = 'N'.
  153: *> \endverbatim
  154: *>
  155: *> \param[in] LDVSR
  156: *> \verbatim
  157: *>          LDVSR is INTEGER
  158: *>          The leading dimension of the matrix VSR. LDVSR >= 1, and
  159: *>          if JOBVSR = 'V', LDVSR >= N.
  160: *> \endverbatim
  161: *>
  162: *> \param[out] WORK
  163: *> \verbatim
  164: *>          WORK is COMPLEX*16 array, dimension (MAX(1,LWORK))
  165: *>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
  166: *> \endverbatim
  167: *>
  168: *> \param[in] LWORK
  169: *> \verbatim
  170: *>          LWORK is INTEGER
  171: *>          The dimension of the array WORK.  LWORK >= max(1,2*N).
  172: *>          For good performance, LWORK must generally be larger.
  173: *>          To compute the optimal value of LWORK, call ILAENV to get
  174: *>          blocksizes (for ZGEQRF, ZUNMQR, and CUNGQR.)  Then compute:
  175: *>          NB  -- MAX of the blocksizes for ZGEQRF, ZUNMQR, and CUNGQR;
  176: *>          the optimal LWORK is N*(NB+1).
  177: *>
  178: *>          If LWORK = -1, then a workspace query is assumed; the routine
  179: *>          only calculates the optimal size of the WORK array, returns
  180: *>          this value as the first entry of the WORK array, and no error
  181: *>          message related to LWORK is issued by XERBLA.
  182: *> \endverbatim
  183: *>
  184: *> \param[out] RWORK
  185: *> \verbatim
  186: *>          RWORK is DOUBLE PRECISION array, dimension (3*N)
  187: *> \endverbatim
  188: *>
  189: *> \param[out] INFO
  190: *> \verbatim
  191: *>          INFO is INTEGER
  192: *>          = 0:  successful exit
  193: *>          < 0:  if INFO = -i, the i-th argument had an illegal value.
  194: *>          =1,...,N:
  195: *>                The QZ iteration failed.  (A,B) are not in Schur
  196: *>                form, but ALPHA(j) and BETA(j) should be correct for
  197: *>                j=INFO+1,...,N.
  198: *>          > N:  errors that usually indicate LAPACK problems:
  199: *>                =N+1: error return from ZGGBAL
  200: *>                =N+2: error return from ZGEQRF
  201: *>                =N+3: error return from ZUNMQR
  202: *>                =N+4: error return from ZUNGQR
  203: *>                =N+5: error return from ZGGHRD
  204: *>                =N+6: error return from ZHGEQZ (other than failed
  205: *>                                               iteration)
  206: *>                =N+7: error return from ZGGBAK (computing VSL)
  207: *>                =N+8: error return from ZGGBAK (computing VSR)
  208: *>                =N+9: error return from ZLASCL (various places)
  209: *> \endverbatim
  210: *
  211: *  Authors:
  212: *  ========
  213: *
  214: *> \author Univ. of Tennessee
  215: *> \author Univ. of California Berkeley
  216: *> \author Univ. of Colorado Denver
  217: *> \author NAG Ltd.
  218: *
  219: *> \ingroup complex16GEeigen
  220: *
  221: *  =====================================================================
  222:       SUBROUTINE ZGEGS( JOBVSL, JOBVSR, N, A, LDA, B, LDB, ALPHA, BETA,
  223:      $                  VSL, LDVSL, VSR, LDVSR, WORK, LWORK, RWORK,
  224:      $                  INFO )
  225: *
  226: *  -- LAPACK driver routine --
  227: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  228: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  229: *
  230: *     .. Scalar Arguments ..
  231:       CHARACTER          JOBVSL, JOBVSR
  232:       INTEGER            INFO, LDA, LDB, LDVSL, LDVSR, LWORK, N
  233: *     ..
  234: *     .. Array Arguments ..
  235:       DOUBLE PRECISION   RWORK( * )
  236:       COMPLEX*16         A( LDA, * ), ALPHA( * ), B( LDB, * ),
  237:      $                   BETA( * ), VSL( LDVSL, * ), VSR( LDVSR, * ),
  238:      $                   WORK( * )
  239: *     ..
  240: *
  241: *  =====================================================================
  242: *
  243: *     .. Parameters ..
  244:       DOUBLE PRECISION   ZERO, ONE
  245:       PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
  246:       COMPLEX*16         CZERO, CONE
  247:       PARAMETER          ( CZERO = ( 0.0D0, 0.0D0 ),
  248:      $                   CONE = ( 1.0D0, 0.0D0 ) )
  249: *     ..
  250: *     .. Local Scalars ..
  251:       LOGICAL            ILASCL, ILBSCL, ILVSL, ILVSR, LQUERY
  252:       INTEGER            ICOLS, IHI, IINFO, IJOBVL, IJOBVR, ILEFT, ILO,
  253:      $                   IRIGHT, IROWS, IRWORK, ITAU, IWORK, LOPT,
  254:      $                   LWKMIN, LWKOPT, NB, NB1, NB2, NB3
  255:       DOUBLE PRECISION   ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
  256:      $                   SAFMIN, SMLNUM
  257: *     ..
  258: *     .. External Subroutines ..
  259:       EXTERNAL           XERBLA, ZGEQRF, ZGGBAK, ZGGBAL, ZGGHRD, ZHGEQZ,
  260:      $                   ZLACPY, ZLASCL, ZLASET, ZUNGQR, ZUNMQR
  261: *     ..
  262: *     .. External Functions ..
  263:       LOGICAL            LSAME
  264:       INTEGER            ILAENV
  265:       DOUBLE PRECISION   DLAMCH, ZLANGE
  266:       EXTERNAL           LSAME, ILAENV, DLAMCH, ZLANGE
  267: *     ..
  268: *     .. Intrinsic Functions ..
  269:       INTRINSIC          INT, MAX
  270: *     ..
  271: *     .. Executable Statements ..
  272: *
  273: *     Decode the input arguments
  274: *
  275:       IF( LSAME( JOBVSL, 'N' ) ) THEN
  276:          IJOBVL = 1
  277:          ILVSL = .FALSE.
  278:       ELSE IF( LSAME( JOBVSL, 'V' ) ) THEN
  279:          IJOBVL = 2
  280:          ILVSL = .TRUE.
  281:       ELSE
  282:          IJOBVL = -1
  283:          ILVSL = .FALSE.
  284:       END IF
  285: *
  286:       IF( LSAME( JOBVSR, 'N' ) ) THEN
  287:          IJOBVR = 1
  288:          ILVSR = .FALSE.
  289:       ELSE IF( LSAME( JOBVSR, 'V' ) ) THEN
  290:          IJOBVR = 2
  291:          ILVSR = .TRUE.
  292:       ELSE
  293:          IJOBVR = -1
  294:          ILVSR = .FALSE.
  295:       END IF
  296: *
  297: *     Test the input arguments
  298: *
  299:       LWKMIN = MAX( 2*N, 1 )
  300:       LWKOPT = LWKMIN
  301:       WORK( 1 ) = LWKOPT
  302:       LQUERY = ( LWORK.EQ.-1 )
  303:       INFO = 0
  304:       IF( IJOBVL.LE.0 ) THEN
  305:          INFO = -1
  306:       ELSE IF( IJOBVR.LE.0 ) THEN
  307:          INFO = -2
  308:       ELSE IF( N.LT.0 ) THEN
  309:          INFO = -3
  310:       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
  311:          INFO = -5
  312:       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
  313:          INFO = -7
  314:       ELSE IF( LDVSL.LT.1 .OR. ( ILVSL .AND. LDVSL.LT.N ) ) THEN
  315:          INFO = -11
  316:       ELSE IF( LDVSR.LT.1 .OR. ( ILVSR .AND. LDVSR.LT.N ) ) THEN
  317:          INFO = -13
  318:       ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
  319:          INFO = -15
  320:       END IF
  321: *
  322:       IF( INFO.EQ.0 ) THEN
  323:          NB1 = ILAENV( 1, 'ZGEQRF', ' ', N, N, -1, -1 )
  324:          NB2 = ILAENV( 1, 'ZUNMQR', ' ', N, N, N, -1 )
  325:          NB3 = ILAENV( 1, 'ZUNGQR', ' ', N, N, N, -1 )
  326:          NB = MAX( NB1, NB2, NB3 )
  327:          LOPT = N*( NB+1 )
  328:          WORK( 1 ) = LOPT
  329:       END IF
  330: *
  331:       IF( INFO.NE.0 ) THEN
  332:          CALL XERBLA( 'ZGEGS ', -INFO )
  333:          RETURN
  334:       ELSE IF( LQUERY ) THEN
  335:          RETURN
  336:       END IF
  337: *
  338: *     Quick return if possible
  339: *
  340:       IF( N.EQ.0 )
  341:      $   RETURN
  342: *
  343: *     Get machine constants
  344: *
  345:       EPS = DLAMCH( 'E' )*DLAMCH( 'B' )
  346:       SAFMIN = DLAMCH( 'S' )
  347:       SMLNUM = N*SAFMIN / EPS
  348:       BIGNUM = ONE / SMLNUM
  349: *
  350: *     Scale A if max element outside range [SMLNUM,BIGNUM]
  351: *
  352:       ANRM = ZLANGE( 'M', N, N, A, LDA, RWORK )
  353:       ILASCL = .FALSE.
  354:       IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
  355:          ANRMTO = SMLNUM
  356:          ILASCL = .TRUE.
  357:       ELSE IF( ANRM.GT.BIGNUM ) THEN
  358:          ANRMTO = BIGNUM
  359:          ILASCL = .TRUE.
  360:       END IF
  361: *
  362:       IF( ILASCL ) THEN
  363:          CALL ZLASCL( 'G', -1, -1, ANRM, ANRMTO, N, N, A, LDA, IINFO )
  364:          IF( IINFO.NE.0 ) THEN
  365:             INFO = N + 9
  366:             RETURN
  367:          END IF
  368:       END IF
  369: *
  370: *     Scale B if max element outside range [SMLNUM,BIGNUM]
  371: *
  372:       BNRM = ZLANGE( 'M', N, N, B, LDB, RWORK )
  373:       ILBSCL = .FALSE.
  374:       IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
  375:          BNRMTO = SMLNUM
  376:          ILBSCL = .TRUE.
  377:       ELSE IF( BNRM.GT.BIGNUM ) THEN
  378:          BNRMTO = BIGNUM
  379:          ILBSCL = .TRUE.
  380:       END IF
  381: *
  382:       IF( ILBSCL ) THEN
  383:          CALL ZLASCL( 'G', -1, -1, BNRM, BNRMTO, N, N, B, LDB, IINFO )
  384:          IF( IINFO.NE.0 ) THEN
  385:             INFO = N + 9
  386:             RETURN
  387:          END IF
  388:       END IF
  389: *
  390: *     Permute the matrix to make it more nearly triangular
  391: *
  392:       ILEFT = 1
  393:       IRIGHT = N + 1
  394:       IRWORK = IRIGHT + N
  395:       IWORK = 1
  396:       CALL ZGGBAL( 'P', N, A, LDA, B, LDB, ILO, IHI, RWORK( ILEFT ),
  397:      $             RWORK( IRIGHT ), RWORK( IRWORK ), IINFO )
  398:       IF( IINFO.NE.0 ) THEN
  399:          INFO = N + 1
  400:          GO TO 10
  401:       END IF
  402: *
  403: *     Reduce B to triangular form, and initialize VSL and/or VSR
  404: *
  405:       IROWS = IHI + 1 - ILO
  406:       ICOLS = N + 1 - ILO
  407:       ITAU = IWORK
  408:       IWORK = ITAU + IROWS
  409:       CALL ZGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
  410:      $             WORK( IWORK ), LWORK+1-IWORK, IINFO )
  411:       IF( IINFO.GE.0 )
  412:      $   LWKOPT = MAX( LWKOPT, INT( WORK( IWORK ) )+IWORK-1 )
  413:       IF( IINFO.NE.0 ) THEN
  414:          INFO = N + 2
  415:          GO TO 10
  416:       END IF
  417: *
  418:       CALL ZUNMQR( 'L', 'C', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
  419:      $             WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWORK ),
  420:      $             LWORK+1-IWORK, IINFO )
  421:       IF( IINFO.GE.0 )
  422:      $   LWKOPT = MAX( LWKOPT, INT( WORK( IWORK ) )+IWORK-1 )
  423:       IF( IINFO.NE.0 ) THEN
  424:          INFO = N + 3
  425:          GO TO 10
  426:       END IF
  427: *
  428:       IF( ILVSL ) THEN
  429:          CALL ZLASET( 'Full', N, N, CZERO, CONE, VSL, LDVSL )
  430:          CALL ZLACPY( 'L', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
  431:      $                VSL( ILO+1, ILO ), LDVSL )
  432:          CALL ZUNGQR( IROWS, IROWS, IROWS, VSL( ILO, ILO ), LDVSL,
  433:      $                WORK( ITAU ), WORK( IWORK ), LWORK+1-IWORK,
  434:      $                IINFO )
  435:          IF( IINFO.GE.0 )
  436:      $      LWKOPT = MAX( LWKOPT, INT( WORK( IWORK ) )+IWORK-1 )
  437:          IF( IINFO.NE.0 ) THEN
  438:             INFO = N + 4
  439:             GO TO 10
  440:          END IF
  441:       END IF
  442: *
  443:       IF( ILVSR )
  444:      $   CALL ZLASET( 'Full', N, N, CZERO, CONE, VSR, LDVSR )
  445: *
  446: *     Reduce to generalized Hessenberg form
  447: *
  448:       CALL ZGGHRD( JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB, VSL,
  449:      $             LDVSL, VSR, LDVSR, IINFO )
  450:       IF( IINFO.NE.0 ) THEN
  451:          INFO = N + 5
  452:          GO TO 10
  453:       END IF
  454: *
  455: *     Perform QZ algorithm, computing Schur vectors if desired
  456: *
  457:       IWORK = ITAU
  458:       CALL ZHGEQZ( 'S', JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB,
  459:      $             ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK( IWORK ),
  460:      $             LWORK+1-IWORK, RWORK( IRWORK ), IINFO )
  461:       IF( IINFO.GE.0 )
  462:      $   LWKOPT = MAX( LWKOPT, INT( WORK( IWORK ) )+IWORK-1 )
  463:       IF( IINFO.NE.0 ) THEN
  464:          IF( IINFO.GT.0 .AND. IINFO.LE.N ) THEN
  465:             INFO = IINFO
  466:          ELSE IF( IINFO.GT.N .AND. IINFO.LE.2*N ) THEN
  467:             INFO = IINFO - N
  468:          ELSE
  469:             INFO = N + 6
  470:          END IF
  471:          GO TO 10
  472:       END IF
  473: *
  474: *     Apply permutation to VSL and VSR
  475: *
  476:       IF( ILVSL ) THEN
  477:          CALL ZGGBAK( 'P', 'L', N, ILO, IHI, RWORK( ILEFT ),
  478:      $                RWORK( IRIGHT ), N, VSL, LDVSL, IINFO )
  479:          IF( IINFO.NE.0 ) THEN
  480:             INFO = N + 7
  481:             GO TO 10
  482:          END IF
  483:       END IF
  484:       IF( ILVSR ) THEN
  485:          CALL ZGGBAK( 'P', 'R', N, ILO, IHI, RWORK( ILEFT ),
  486:      $                RWORK( IRIGHT ), N, VSR, LDVSR, IINFO )
  487:          IF( IINFO.NE.0 ) THEN
  488:             INFO = N + 8
  489:             GO TO 10
  490:          END IF
  491:       END IF
  492: *
  493: *     Undo scaling
  494: *
  495:       IF( ILASCL ) THEN
  496:          CALL ZLASCL( 'U', -1, -1, ANRMTO, ANRM, N, N, A, LDA, IINFO )
  497:          IF( IINFO.NE.0 ) THEN
  498:             INFO = N + 9
  499:             RETURN
  500:          END IF
  501:          CALL ZLASCL( 'G', -1, -1, ANRMTO, ANRM, N, 1, ALPHA, N, IINFO )
  502:          IF( IINFO.NE.0 ) THEN
  503:             INFO = N + 9
  504:             RETURN
  505:          END IF
  506:       END IF
  507: *
  508:       IF( ILBSCL ) THEN
  509:          CALL ZLASCL( 'U', -1, -1, BNRMTO, BNRM, N, N, B, LDB, IINFO )
  510:          IF( IINFO.NE.0 ) THEN
  511:             INFO = N + 9
  512:             RETURN
  513:          END IF
  514:          CALL ZLASCL( 'G', -1, -1, BNRMTO, BNRM, N, 1, BETA, N, IINFO )
  515:          IF( IINFO.NE.0 ) THEN
  516:             INFO = N + 9
  517:             RETURN
  518:          END IF
  519:       END IF
  520: *
  521:    10 CONTINUE
  522:       WORK( 1 ) = LWKOPT
  523: *
  524:       RETURN
  525: *
  526: *     End of ZGEGS
  527: *
  528:       END

CVSweb interface <joel.bertrand@systella.fr>