File:  [local] / rpl / lapack / lapack / dtrsyl.f
Revision 1.16: download - view: text, annotated - select for diffs - revision graph
Sat Jun 17 11:06:38 2017 UTC (6 years, 10 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_27, rpl-4_1_26, HEAD
Cohérence.

    1: *> \brief \b DTRSYL
    2: *
    3: *  =========== DOCUMENTATION ===========
    4: *
    5: * Online html documentation available at
    6: *            http://www.netlib.org/lapack/explore-html/
    7: *
    8: *> \htmlonly
    9: *> Download DTRSYL + dependencies
   10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dtrsyl.f">
   11: *> [TGZ]</a>
   12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dtrsyl.f">
   13: *> [ZIP]</a>
   14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dtrsyl.f">
   15: *> [TXT]</a>
   16: *> \endhtmlonly
   17: *
   18: *  Definition:
   19: *  ===========
   20: *
   21: *       SUBROUTINE DTRSYL( TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C,
   22: *                          LDC, SCALE, INFO )
   23: *
   24: *       .. Scalar Arguments ..
   25: *       CHARACTER          TRANA, TRANB
   26: *       INTEGER            INFO, ISGN, LDA, LDB, LDC, M, N
   27: *       DOUBLE PRECISION   SCALE
   28: *       ..
   29: *       .. Array Arguments ..
   30: *       DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), C( LDC, * )
   31: *       ..
   32: *
   33: *
   34: *> \par Purpose:
   35: *  =============
   36: *>
   37: *> \verbatim
   38: *>
   39: *> DTRSYL solves the real Sylvester matrix equation:
   40: *>
   41: *>    op(A)*X + X*op(B) = scale*C or
   42: *>    op(A)*X - X*op(B) = scale*C,
   43: *>
   44: *> where op(A) = A or A**T, and  A and B are both upper quasi-
   45: *> triangular. A is M-by-M and B is N-by-N; the right hand side C and
   46: *> the solution X are M-by-N; and scale is an output scale factor, set
   47: *> <= 1 to avoid overflow in X.
   48: *>
   49: *> A and B must be in Schur canonical form (as returned by DHSEQR), that
   50: *> is, block upper triangular with 1-by-1 and 2-by-2 diagonal blocks;
   51: *> each 2-by-2 diagonal block has its diagonal elements equal and its
   52: *> off-diagonal elements of opposite sign.
   53: *> \endverbatim
   54: *
   55: *  Arguments:
   56: *  ==========
   57: *
   58: *> \param[in] TRANA
   59: *> \verbatim
   60: *>          TRANA is CHARACTER*1
   61: *>          Specifies the option op(A):
   62: *>          = 'N': op(A) = A    (No transpose)
   63: *>          = 'T': op(A) = A**T (Transpose)
   64: *>          = 'C': op(A) = A**H (Conjugate transpose = Transpose)
   65: *> \endverbatim
   66: *>
   67: *> \param[in] TRANB
   68: *> \verbatim
   69: *>          TRANB is CHARACTER*1
   70: *>          Specifies the option op(B):
   71: *>          = 'N': op(B) = B    (No transpose)
   72: *>          = 'T': op(B) = B**T (Transpose)
   73: *>          = 'C': op(B) = B**H (Conjugate transpose = Transpose)
   74: *> \endverbatim
   75: *>
   76: *> \param[in] ISGN
   77: *> \verbatim
   78: *>          ISGN is INTEGER
   79: *>          Specifies the sign in the equation:
   80: *>          = +1: solve op(A)*X + X*op(B) = scale*C
   81: *>          = -1: solve op(A)*X - X*op(B) = scale*C
   82: *> \endverbatim
   83: *>
   84: *> \param[in] M
   85: *> \verbatim
   86: *>          M is INTEGER
   87: *>          The order of the matrix A, and the number of rows in the
   88: *>          matrices X and C. M >= 0.
   89: *> \endverbatim
   90: *>
   91: *> \param[in] N
   92: *> \verbatim
   93: *>          N is INTEGER
   94: *>          The order of the matrix B, and the number of columns in the
   95: *>          matrices X and C. N >= 0.
   96: *> \endverbatim
   97: *>
   98: *> \param[in] A
   99: *> \verbatim
  100: *>          A is DOUBLE PRECISION array, dimension (LDA,M)
  101: *>          The upper quasi-triangular matrix A, in Schur canonical form.
  102: *> \endverbatim
  103: *>
  104: *> \param[in] LDA
  105: *> \verbatim
  106: *>          LDA is INTEGER
  107: *>          The leading dimension of the array A. LDA >= max(1,M).
  108: *> \endverbatim
  109: *>
  110: *> \param[in] B
  111: *> \verbatim
  112: *>          B is DOUBLE PRECISION array, dimension (LDB,N)
  113: *>          The upper quasi-triangular matrix B, in Schur canonical form.
  114: *> \endverbatim
  115: *>
  116: *> \param[in] LDB
  117: *> \verbatim
  118: *>          LDB is INTEGER
  119: *>          The leading dimension of the array B. LDB >= max(1,N).
  120: *> \endverbatim
  121: *>
  122: *> \param[in,out] C
  123: *> \verbatim
  124: *>          C is DOUBLE PRECISION array, dimension (LDC,N)
  125: *>          On entry, the M-by-N right hand side matrix C.
  126: *>          On exit, C is overwritten by the solution matrix X.
  127: *> \endverbatim
  128: *>
  129: *> \param[in] LDC
  130: *> \verbatim
  131: *>          LDC is INTEGER
  132: *>          The leading dimension of the array C. LDC >= max(1,M)
  133: *> \endverbatim
  134: *>
  135: *> \param[out] SCALE
  136: *> \verbatim
  137: *>          SCALE is DOUBLE PRECISION
  138: *>          The scale factor, scale, set <= 1 to avoid overflow in X.
  139: *> \endverbatim
  140: *>
  141: *> \param[out] INFO
  142: *> \verbatim
  143: *>          INFO is INTEGER
  144: *>          = 0: successful exit
  145: *>          < 0: if INFO = -i, the i-th argument had an illegal value
  146: *>          = 1: A and B have common or very close eigenvalues; perturbed
  147: *>               values were used to solve the equation (but the matrices
  148: *>               A and B are unchanged).
  149: *> \endverbatim
  150: *
  151: *  Authors:
  152: *  ========
  153: *
  154: *> \author Univ. of Tennessee
  155: *> \author Univ. of California Berkeley
  156: *> \author Univ. of Colorado Denver
  157: *> \author NAG Ltd.
  158: *
  159: *> \date December 2016
  160: *
  161: *> \ingroup doubleSYcomputational
  162: *
  163: *  =====================================================================
  164:       SUBROUTINE DTRSYL( TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C,
  165:      $                   LDC, SCALE, INFO )
  166: *
  167: *  -- LAPACK computational routine (version 3.7.0) --
  168: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  169: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  170: *     December 2016
  171: *
  172: *     .. Scalar Arguments ..
  173:       CHARACTER          TRANA, TRANB
  174:       INTEGER            INFO, ISGN, LDA, LDB, LDC, M, N
  175:       DOUBLE PRECISION   SCALE
  176: *     ..
  177: *     .. Array Arguments ..
  178:       DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), C( LDC, * )
  179: *     ..
  180: *
  181: *  =====================================================================
  182: *
  183: *     .. Parameters ..
  184:       DOUBLE PRECISION   ZERO, ONE
  185:       PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
  186: *     ..
  187: *     .. Local Scalars ..
  188:       LOGICAL            NOTRNA, NOTRNB
  189:       INTEGER            IERR, J, K, K1, K2, KNEXT, L, L1, L2, LNEXT
  190:       DOUBLE PRECISION   A11, BIGNUM, DA11, DB, EPS, SCALOC, SGN, SMIN,
  191:      $                   SMLNUM, SUML, SUMR, XNORM
  192: *     ..
  193: *     .. Local Arrays ..
  194:       DOUBLE PRECISION   DUM( 1 ), VEC( 2, 2 ), X( 2, 2 )
  195: *     ..
  196: *     .. External Functions ..
  197:       LOGICAL            LSAME
  198:       DOUBLE PRECISION   DDOT, DLAMCH, DLANGE
  199:       EXTERNAL           LSAME, DDOT, DLAMCH, DLANGE
  200: *     ..
  201: *     .. External Subroutines ..
  202:       EXTERNAL           DLABAD, DLALN2, DLASY2, DSCAL, XERBLA
  203: *     ..
  204: *     .. Intrinsic Functions ..
  205:       INTRINSIC          ABS, DBLE, MAX, MIN
  206: *     ..
  207: *     .. Executable Statements ..
  208: *
  209: *     Decode and Test input parameters
  210: *
  211:       NOTRNA = LSAME( TRANA, 'N' )
  212:       NOTRNB = LSAME( TRANB, 'N' )
  213: *
  214:       INFO = 0
  215:       IF( .NOT.NOTRNA .AND. .NOT.LSAME( TRANA, 'T' ) .AND. .NOT.
  216:      $    LSAME( TRANA, 'C' ) ) THEN
  217:          INFO = -1
  218:       ELSE IF( .NOT.NOTRNB .AND. .NOT.LSAME( TRANB, 'T' ) .AND. .NOT.
  219:      $         LSAME( TRANB, 'C' ) ) THEN
  220:          INFO = -2
  221:       ELSE IF( ISGN.NE.1 .AND. ISGN.NE.-1 ) THEN
  222:          INFO = -3
  223:       ELSE IF( M.LT.0 ) THEN
  224:          INFO = -4
  225:       ELSE IF( N.LT.0 ) THEN
  226:          INFO = -5
  227:       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
  228:          INFO = -7
  229:       ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
  230:          INFO = -9
  231:       ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
  232:          INFO = -11
  233:       END IF
  234:       IF( INFO.NE.0 ) THEN
  235:          CALL XERBLA( 'DTRSYL', -INFO )
  236:          RETURN
  237:       END IF
  238: *
  239: *     Quick return if possible
  240: *
  241:       SCALE = ONE
  242:       IF( M.EQ.0 .OR. N.EQ.0 )
  243:      $   RETURN
  244: *
  245: *     Set constants to control overflow
  246: *
  247:       EPS = DLAMCH( 'P' )
  248:       SMLNUM = DLAMCH( 'S' )
  249:       BIGNUM = ONE / SMLNUM
  250:       CALL DLABAD( SMLNUM, BIGNUM )
  251:       SMLNUM = SMLNUM*DBLE( M*N ) / EPS
  252:       BIGNUM = ONE / SMLNUM
  253: *
  254:       SMIN = MAX( SMLNUM, EPS*DLANGE( 'M', M, M, A, LDA, DUM ),
  255:      $       EPS*DLANGE( 'M', N, N, B, LDB, DUM ) )
  256: *
  257:       SGN = ISGN
  258: *
  259:       IF( NOTRNA .AND. NOTRNB ) THEN
  260: *
  261: *        Solve    A*X + ISGN*X*B = scale*C.
  262: *
  263: *        The (K,L)th block of X is determined starting from
  264: *        bottom-left corner column by column by
  265: *
  266: *         A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L)
  267: *
  268: *        Where
  269: *                  M                         L-1
  270: *        R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B(J,L)].
  271: *                I=K+1                       J=1
  272: *
  273: *        Start column loop (index = L)
  274: *        L1 (L2) : column index of the first (first) row of X(K,L).
  275: *
  276:          LNEXT = 1
  277:          DO 60 L = 1, N
  278:             IF( L.LT.LNEXT )
  279:      $         GO TO 60
  280:             IF( L.EQ.N ) THEN
  281:                L1 = L
  282:                L2 = L
  283:             ELSE
  284:                IF( B( L+1, L ).NE.ZERO ) THEN
  285:                   L1 = L
  286:                   L2 = L + 1
  287:                   LNEXT = L + 2
  288:                ELSE
  289:                   L1 = L
  290:                   L2 = L
  291:                   LNEXT = L + 1
  292:                END IF
  293:             END IF
  294: *
  295: *           Start row loop (index = K)
  296: *           K1 (K2): row index of the first (last) row of X(K,L).
  297: *
  298:             KNEXT = M
  299:             DO 50 K = M, 1, -1
  300:                IF( K.GT.KNEXT )
  301:      $            GO TO 50
  302:                IF( K.EQ.1 ) THEN
  303:                   K1 = K
  304:                   K2 = K
  305:                ELSE
  306:                   IF( A( K, K-1 ).NE.ZERO ) THEN
  307:                      K1 = K - 1
  308:                      K2 = K
  309:                      KNEXT = K - 2
  310:                   ELSE
  311:                      K1 = K
  312:                      K2 = K
  313:                      KNEXT = K - 1
  314:                   END IF
  315:                END IF
  316: *
  317:                IF( L1.EQ.L2 .AND. K1.EQ.K2 ) THEN
  318:                   SUML = DDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
  319:      $                   C( MIN( K1+1, M ), L1 ), 1 )
  320:                   SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
  321:                   VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
  322:                   SCALOC = ONE
  323: *
  324:                   A11 = A( K1, K1 ) + SGN*B( L1, L1 )
  325:                   DA11 = ABS( A11 )
  326:                   IF( DA11.LE.SMIN ) THEN
  327:                      A11 = SMIN
  328:                      DA11 = SMIN
  329:                      INFO = 1
  330:                   END IF
  331:                   DB = ABS( VEC( 1, 1 ) )
  332:                   IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
  333:                      IF( DB.GT.BIGNUM*DA11 )
  334:      $                  SCALOC = ONE / DB
  335:                   END IF
  336:                   X( 1, 1 ) = ( VEC( 1, 1 )*SCALOC ) / A11
  337: *
  338:                   IF( SCALOC.NE.ONE ) THEN
  339:                      DO 10 J = 1, N
  340:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  341:    10                CONTINUE
  342:                      SCALE = SCALE*SCALOC
  343:                   END IF
  344:                   C( K1, L1 ) = X( 1, 1 )
  345: *
  346:                ELSE IF( L1.EQ.L2 .AND. K1.NE.K2 ) THEN
  347: *
  348:                   SUML = DDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
  349:      $                   C( MIN( K2+1, M ), L1 ), 1 )
  350:                   SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
  351:                   VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
  352: *
  353:                   SUML = DDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
  354:      $                   C( MIN( K2+1, M ), L1 ), 1 )
  355:                   SUMR = DDOT( L1-1, C( K2, 1 ), LDC, B( 1, L1 ), 1 )
  356:                   VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
  357: *
  358:                   CALL DLALN2( .FALSE., 2, 1, SMIN, ONE, A( K1, K1 ),
  359:      $                         LDA, ONE, ONE, VEC, 2, -SGN*B( L1, L1 ),
  360:      $                         ZERO, X, 2, SCALOC, XNORM, IERR )
  361:                   IF( IERR.NE.0 )
  362:      $               INFO = 1
  363: *
  364:                   IF( SCALOC.NE.ONE ) THEN
  365:                      DO 20 J = 1, N
  366:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  367:    20                CONTINUE
  368:                      SCALE = SCALE*SCALOC
  369:                   END IF
  370:                   C( K1, L1 ) = X( 1, 1 )
  371:                   C( K2, L1 ) = X( 2, 1 )
  372: *
  373:                ELSE IF( L1.NE.L2 .AND. K1.EQ.K2 ) THEN
  374: *
  375:                   SUML = DDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
  376:      $                   C( MIN( K1+1, M ), L1 ), 1 )
  377:                   SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
  378:                   VEC( 1, 1 ) = SGN*( C( K1, L1 )-( SUML+SGN*SUMR ) )
  379: *
  380:                   SUML = DDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
  381:      $                   C( MIN( K1+1, M ), L2 ), 1 )
  382:                   SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L2 ), 1 )
  383:                   VEC( 2, 1 ) = SGN*( C( K1, L2 )-( SUML+SGN*SUMR ) )
  384: *
  385:                   CALL DLALN2( .TRUE., 2, 1, SMIN, ONE, B( L1, L1 ),
  386:      $                         LDB, ONE, ONE, VEC, 2, -SGN*A( K1, K1 ),
  387:      $                         ZERO, X, 2, SCALOC, XNORM, IERR )
  388:                   IF( IERR.NE.0 )
  389:      $               INFO = 1
  390: *
  391:                   IF( SCALOC.NE.ONE ) THEN
  392:                      DO 30 J = 1, N
  393:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  394:    30                CONTINUE
  395:                      SCALE = SCALE*SCALOC
  396:                   END IF
  397:                   C( K1, L1 ) = X( 1, 1 )
  398:                   C( K1, L2 ) = X( 2, 1 )
  399: *
  400:                ELSE IF( L1.NE.L2 .AND. K1.NE.K2 ) THEN
  401: *
  402:                   SUML = DDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
  403:      $                   C( MIN( K2+1, M ), L1 ), 1 )
  404:                   SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
  405:                   VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
  406: *
  407:                   SUML = DDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
  408:      $                   C( MIN( K2+1, M ), L2 ), 1 )
  409:                   SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L2 ), 1 )
  410:                   VEC( 1, 2 ) = C( K1, L2 ) - ( SUML+SGN*SUMR )
  411: *
  412:                   SUML = DDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
  413:      $                   C( MIN( K2+1, M ), L1 ), 1 )
  414:                   SUMR = DDOT( L1-1, C( K2, 1 ), LDC, B( 1, L1 ), 1 )
  415:                   VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
  416: *
  417:                   SUML = DDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
  418:      $                   C( MIN( K2+1, M ), L2 ), 1 )
  419:                   SUMR = DDOT( L1-1, C( K2, 1 ), LDC, B( 1, L2 ), 1 )
  420:                   VEC( 2, 2 ) = C( K2, L2 ) - ( SUML+SGN*SUMR )
  421: *
  422:                   CALL DLASY2( .FALSE., .FALSE., ISGN, 2, 2,
  423:      $                         A( K1, K1 ), LDA, B( L1, L1 ), LDB, VEC,
  424:      $                         2, SCALOC, X, 2, XNORM, IERR )
  425:                   IF( IERR.NE.0 )
  426:      $               INFO = 1
  427: *
  428:                   IF( SCALOC.NE.ONE ) THEN
  429:                      DO 40 J = 1, N
  430:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  431:    40                CONTINUE
  432:                      SCALE = SCALE*SCALOC
  433:                   END IF
  434:                   C( K1, L1 ) = X( 1, 1 )
  435:                   C( K1, L2 ) = X( 1, 2 )
  436:                   C( K2, L1 ) = X( 2, 1 )
  437:                   C( K2, L2 ) = X( 2, 2 )
  438:                END IF
  439: *
  440:    50       CONTINUE
  441: *
  442:    60    CONTINUE
  443: *
  444:       ELSE IF( .NOT.NOTRNA .AND. NOTRNB ) THEN
  445: *
  446: *        Solve    A**T *X + ISGN*X*B = scale*C.
  447: *
  448: *        The (K,L)th block of X is determined starting from
  449: *        upper-left corner column by column by
  450: *
  451: *          A(K,K)**T*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L)
  452: *
  453: *        Where
  454: *                   K-1        T                    L-1
  455: *          R(K,L) = SUM [A(I,K)**T*X(I,L)] +ISGN*SUM [X(K,J)*B(J,L)]
  456: *                   I=1                          J=1
  457: *
  458: *        Start column loop (index = L)
  459: *        L1 (L2): column index of the first (last) row of X(K,L)
  460: *
  461:          LNEXT = 1
  462:          DO 120 L = 1, N
  463:             IF( L.LT.LNEXT )
  464:      $         GO TO 120
  465:             IF( L.EQ.N ) THEN
  466:                L1 = L
  467:                L2 = L
  468:             ELSE
  469:                IF( B( L+1, L ).NE.ZERO ) THEN
  470:                   L1 = L
  471:                   L2 = L + 1
  472:                   LNEXT = L + 2
  473:                ELSE
  474:                   L1 = L
  475:                   L2 = L
  476:                   LNEXT = L + 1
  477:                END IF
  478:             END IF
  479: *
  480: *           Start row loop (index = K)
  481: *           K1 (K2): row index of the first (last) row of X(K,L)
  482: *
  483:             KNEXT = 1
  484:             DO 110 K = 1, M
  485:                IF( K.LT.KNEXT )
  486:      $            GO TO 110
  487:                IF( K.EQ.M ) THEN
  488:                   K1 = K
  489:                   K2 = K
  490:                ELSE
  491:                   IF( A( K+1, K ).NE.ZERO ) THEN
  492:                      K1 = K
  493:                      K2 = K + 1
  494:                      KNEXT = K + 2
  495:                   ELSE
  496:                      K1 = K
  497:                      K2 = K
  498:                      KNEXT = K + 1
  499:                   END IF
  500:                END IF
  501: *
  502:                IF( L1.EQ.L2 .AND. K1.EQ.K2 ) THEN
  503:                   SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
  504:                   SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
  505:                   VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
  506:                   SCALOC = ONE
  507: *
  508:                   A11 = A( K1, K1 ) + SGN*B( L1, L1 )
  509:                   DA11 = ABS( A11 )
  510:                   IF( DA11.LE.SMIN ) THEN
  511:                      A11 = SMIN
  512:                      DA11 = SMIN
  513:                      INFO = 1
  514:                   END IF
  515:                   DB = ABS( VEC( 1, 1 ) )
  516:                   IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
  517:                      IF( DB.GT.BIGNUM*DA11 )
  518:      $                  SCALOC = ONE / DB
  519:                   END IF
  520:                   X( 1, 1 ) = ( VEC( 1, 1 )*SCALOC ) / A11
  521: *
  522:                   IF( SCALOC.NE.ONE ) THEN
  523:                      DO 70 J = 1, N
  524:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  525:    70                CONTINUE
  526:                      SCALE = SCALE*SCALOC
  527:                   END IF
  528:                   C( K1, L1 ) = X( 1, 1 )
  529: *
  530:                ELSE IF( L1.EQ.L2 .AND. K1.NE.K2 ) THEN
  531: *
  532:                   SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
  533:                   SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
  534:                   VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
  535: *
  536:                   SUML = DDOT( K1-1, A( 1, K2 ), 1, C( 1, L1 ), 1 )
  537:                   SUMR = DDOT( L1-1, C( K2, 1 ), LDC, B( 1, L1 ), 1 )
  538:                   VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
  539: *
  540:                   CALL DLALN2( .TRUE., 2, 1, SMIN, ONE, A( K1, K1 ),
  541:      $                         LDA, ONE, ONE, VEC, 2, -SGN*B( L1, L1 ),
  542:      $                         ZERO, X, 2, SCALOC, XNORM, IERR )
  543:                   IF( IERR.NE.0 )
  544:      $               INFO = 1
  545: *
  546:                   IF( SCALOC.NE.ONE ) THEN
  547:                      DO 80 J = 1, N
  548:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  549:    80                CONTINUE
  550:                      SCALE = SCALE*SCALOC
  551:                   END IF
  552:                   C( K1, L1 ) = X( 1, 1 )
  553:                   C( K2, L1 ) = X( 2, 1 )
  554: *
  555:                ELSE IF( L1.NE.L2 .AND. K1.EQ.K2 ) THEN
  556: *
  557:                   SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
  558:                   SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
  559:                   VEC( 1, 1 ) = SGN*( C( K1, L1 )-( SUML+SGN*SUMR ) )
  560: *
  561:                   SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L2 ), 1 )
  562:                   SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L2 ), 1 )
  563:                   VEC( 2, 1 ) = SGN*( C( K1, L2 )-( SUML+SGN*SUMR ) )
  564: *
  565:                   CALL DLALN2( .TRUE., 2, 1, SMIN, ONE, B( L1, L1 ),
  566:      $                         LDB, ONE, ONE, VEC, 2, -SGN*A( K1, K1 ),
  567:      $                         ZERO, X, 2, SCALOC, XNORM, IERR )
  568:                   IF( IERR.NE.0 )
  569:      $               INFO = 1
  570: *
  571:                   IF( SCALOC.NE.ONE ) THEN
  572:                      DO 90 J = 1, N
  573:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  574:    90                CONTINUE
  575:                      SCALE = SCALE*SCALOC
  576:                   END IF
  577:                   C( K1, L1 ) = X( 1, 1 )
  578:                   C( K1, L2 ) = X( 2, 1 )
  579: *
  580:                ELSE IF( L1.NE.L2 .AND. K1.NE.K2 ) THEN
  581: *
  582:                   SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
  583:                   SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L1 ), 1 )
  584:                   VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
  585: *
  586:                   SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L2 ), 1 )
  587:                   SUMR = DDOT( L1-1, C( K1, 1 ), LDC, B( 1, L2 ), 1 )
  588:                   VEC( 1, 2 ) = C( K1, L2 ) - ( SUML+SGN*SUMR )
  589: *
  590:                   SUML = DDOT( K1-1, A( 1, K2 ), 1, C( 1, L1 ), 1 )
  591:                   SUMR = DDOT( L1-1, C( K2, 1 ), LDC, B( 1, L1 ), 1 )
  592:                   VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
  593: *
  594:                   SUML = DDOT( K1-1, A( 1, K2 ), 1, C( 1, L2 ), 1 )
  595:                   SUMR = DDOT( L1-1, C( K2, 1 ), LDC, B( 1, L2 ), 1 )
  596:                   VEC( 2, 2 ) = C( K2, L2 ) - ( SUML+SGN*SUMR )
  597: *
  598:                   CALL DLASY2( .TRUE., .FALSE., ISGN, 2, 2, A( K1, K1 ),
  599:      $                         LDA, B( L1, L1 ), LDB, VEC, 2, SCALOC, X,
  600:      $                         2, XNORM, IERR )
  601:                   IF( IERR.NE.0 )
  602:      $               INFO = 1
  603: *
  604:                   IF( SCALOC.NE.ONE ) THEN
  605:                      DO 100 J = 1, N
  606:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  607:   100                CONTINUE
  608:                      SCALE = SCALE*SCALOC
  609:                   END IF
  610:                   C( K1, L1 ) = X( 1, 1 )
  611:                   C( K1, L2 ) = X( 1, 2 )
  612:                   C( K2, L1 ) = X( 2, 1 )
  613:                   C( K2, L2 ) = X( 2, 2 )
  614:                END IF
  615: *
  616:   110       CONTINUE
  617:   120    CONTINUE
  618: *
  619:       ELSE IF( .NOT.NOTRNA .AND. .NOT.NOTRNB ) THEN
  620: *
  621: *        Solve    A**T*X + ISGN*X*B**T = scale*C.
  622: *
  623: *        The (K,L)th block of X is determined starting from
  624: *        top-right corner column by column by
  625: *
  626: *           A(K,K)**T*X(K,L) + ISGN*X(K,L)*B(L,L)**T = C(K,L) - R(K,L)
  627: *
  628: *        Where
  629: *                     K-1                            N
  630: *            R(K,L) = SUM [A(I,K)**T*X(I,L)] + ISGN*SUM [X(K,J)*B(L,J)**T].
  631: *                     I=1                          J=L+1
  632: *
  633: *        Start column loop (index = L)
  634: *        L1 (L2): column index of the first (last) row of X(K,L)
  635: *
  636:          LNEXT = N
  637:          DO 180 L = N, 1, -1
  638:             IF( L.GT.LNEXT )
  639:      $         GO TO 180
  640:             IF( L.EQ.1 ) THEN
  641:                L1 = L
  642:                L2 = L
  643:             ELSE
  644:                IF( B( L, L-1 ).NE.ZERO ) THEN
  645:                   L1 = L - 1
  646:                   L2 = L
  647:                   LNEXT = L - 2
  648:                ELSE
  649:                   L1 = L
  650:                   L2 = L
  651:                   LNEXT = L - 1
  652:                END IF
  653:             END IF
  654: *
  655: *           Start row loop (index = K)
  656: *           K1 (K2): row index of the first (last) row of X(K,L)
  657: *
  658:             KNEXT = 1
  659:             DO 170 K = 1, M
  660:                IF( K.LT.KNEXT )
  661:      $            GO TO 170
  662:                IF( K.EQ.M ) THEN
  663:                   K1 = K
  664:                   K2 = K
  665:                ELSE
  666:                   IF( A( K+1, K ).NE.ZERO ) THEN
  667:                      K1 = K
  668:                      K2 = K + 1
  669:                      KNEXT = K + 2
  670:                   ELSE
  671:                      K1 = K
  672:                      K2 = K
  673:                      KNEXT = K + 1
  674:                   END IF
  675:                END IF
  676: *
  677:                IF( L1.EQ.L2 .AND. K1.EQ.K2 ) THEN
  678:                   SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
  679:                   SUMR = DDOT( N-L1, C( K1, MIN( L1+1, N ) ), LDC,
  680:      $                   B( L1, MIN( L1+1, N ) ), LDB )
  681:                   VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
  682:                   SCALOC = ONE
  683: *
  684:                   A11 = A( K1, K1 ) + SGN*B( L1, L1 )
  685:                   DA11 = ABS( A11 )
  686:                   IF( DA11.LE.SMIN ) THEN
  687:                      A11 = SMIN
  688:                      DA11 = SMIN
  689:                      INFO = 1
  690:                   END IF
  691:                   DB = ABS( VEC( 1, 1 ) )
  692:                   IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
  693:                      IF( DB.GT.BIGNUM*DA11 )
  694:      $                  SCALOC = ONE / DB
  695:                   END IF
  696:                   X( 1, 1 ) = ( VEC( 1, 1 )*SCALOC ) / A11
  697: *
  698:                   IF( SCALOC.NE.ONE ) THEN
  699:                      DO 130 J = 1, N
  700:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  701:   130                CONTINUE
  702:                      SCALE = SCALE*SCALOC
  703:                   END IF
  704:                   C( K1, L1 ) = X( 1, 1 )
  705: *
  706:                ELSE IF( L1.EQ.L2 .AND. K1.NE.K2 ) THEN
  707: *
  708:                   SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
  709:                   SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
  710:      $                   B( L1, MIN( L2+1, N ) ), LDB )
  711:                   VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
  712: *
  713:                   SUML = DDOT( K1-1, A( 1, K2 ), 1, C( 1, L1 ), 1 )
  714:                   SUMR = DDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
  715:      $                   B( L1, MIN( L2+1, N ) ), LDB )
  716:                   VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
  717: *
  718:                   CALL DLALN2( .TRUE., 2, 1, SMIN, ONE, A( K1, K1 ),
  719:      $                         LDA, ONE, ONE, VEC, 2, -SGN*B( L1, L1 ),
  720:      $                         ZERO, X, 2, SCALOC, XNORM, IERR )
  721:                   IF( IERR.NE.0 )
  722:      $               INFO = 1
  723: *
  724:                   IF( SCALOC.NE.ONE ) THEN
  725:                      DO 140 J = 1, N
  726:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  727:   140                CONTINUE
  728:                      SCALE = SCALE*SCALOC
  729:                   END IF
  730:                   C( K1, L1 ) = X( 1, 1 )
  731:                   C( K2, L1 ) = X( 2, 1 )
  732: *
  733:                ELSE IF( L1.NE.L2 .AND. K1.EQ.K2 ) THEN
  734: *
  735:                   SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
  736:                   SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
  737:      $                   B( L1, MIN( L2+1, N ) ), LDB )
  738:                   VEC( 1, 1 ) = SGN*( C( K1, L1 )-( SUML+SGN*SUMR ) )
  739: *
  740:                   SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L2 ), 1 )
  741:                   SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
  742:      $                   B( L2, MIN( L2+1, N ) ), LDB )
  743:                   VEC( 2, 1 ) = SGN*( C( K1, L2 )-( SUML+SGN*SUMR ) )
  744: *
  745:                   CALL DLALN2( .FALSE., 2, 1, SMIN, ONE, B( L1, L1 ),
  746:      $                         LDB, ONE, ONE, VEC, 2, -SGN*A( K1, K1 ),
  747:      $                         ZERO, X, 2, SCALOC, XNORM, IERR )
  748:                   IF( IERR.NE.0 )
  749:      $               INFO = 1
  750: *
  751:                   IF( SCALOC.NE.ONE ) THEN
  752:                      DO 150 J = 1, N
  753:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  754:   150                CONTINUE
  755:                      SCALE = SCALE*SCALOC
  756:                   END IF
  757:                   C( K1, L1 ) = X( 1, 1 )
  758:                   C( K1, L2 ) = X( 2, 1 )
  759: *
  760:                ELSE IF( L1.NE.L2 .AND. K1.NE.K2 ) THEN
  761: *
  762:                   SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L1 ), 1 )
  763:                   SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
  764:      $                   B( L1, MIN( L2+1, N ) ), LDB )
  765:                   VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
  766: *
  767:                   SUML = DDOT( K1-1, A( 1, K1 ), 1, C( 1, L2 ), 1 )
  768:                   SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
  769:      $                   B( L2, MIN( L2+1, N ) ), LDB )
  770:                   VEC( 1, 2 ) = C( K1, L2 ) - ( SUML+SGN*SUMR )
  771: *
  772:                   SUML = DDOT( K1-1, A( 1, K2 ), 1, C( 1, L1 ), 1 )
  773:                   SUMR = DDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
  774:      $                   B( L1, MIN( L2+1, N ) ), LDB )
  775:                   VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
  776: *
  777:                   SUML = DDOT( K1-1, A( 1, K2 ), 1, C( 1, L2 ), 1 )
  778:                   SUMR = DDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
  779:      $                   B( L2, MIN( L2+1, N ) ), LDB )
  780:                   VEC( 2, 2 ) = C( K2, L2 ) - ( SUML+SGN*SUMR )
  781: *
  782:                   CALL DLASY2( .TRUE., .TRUE., ISGN, 2, 2, A( K1, K1 ),
  783:      $                         LDA, B( L1, L1 ), LDB, VEC, 2, SCALOC, X,
  784:      $                         2, XNORM, IERR )
  785:                   IF( IERR.NE.0 )
  786:      $               INFO = 1
  787: *
  788:                   IF( SCALOC.NE.ONE ) THEN
  789:                      DO 160 J = 1, N
  790:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  791:   160                CONTINUE
  792:                      SCALE = SCALE*SCALOC
  793:                   END IF
  794:                   C( K1, L1 ) = X( 1, 1 )
  795:                   C( K1, L2 ) = X( 1, 2 )
  796:                   C( K2, L1 ) = X( 2, 1 )
  797:                   C( K2, L2 ) = X( 2, 2 )
  798:                END IF
  799: *
  800:   170       CONTINUE
  801:   180    CONTINUE
  802: *
  803:       ELSE IF( NOTRNA .AND. .NOT.NOTRNB ) THEN
  804: *
  805: *        Solve    A*X + ISGN*X*B**T = scale*C.
  806: *
  807: *        The (K,L)th block of X is determined starting from
  808: *        bottom-right corner column by column by
  809: *
  810: *            A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L)**T = C(K,L) - R(K,L)
  811: *
  812: *        Where
  813: *                      M                          N
  814: *            R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B(L,J)**T].
  815: *                    I=K+1                      J=L+1
  816: *
  817: *        Start column loop (index = L)
  818: *        L1 (L2): column index of the first (last) row of X(K,L)
  819: *
  820:          LNEXT = N
  821:          DO 240 L = N, 1, -1
  822:             IF( L.GT.LNEXT )
  823:      $         GO TO 240
  824:             IF( L.EQ.1 ) THEN
  825:                L1 = L
  826:                L2 = L
  827:             ELSE
  828:                IF( B( L, L-1 ).NE.ZERO ) THEN
  829:                   L1 = L - 1
  830:                   L2 = L
  831:                   LNEXT = L - 2
  832:                ELSE
  833:                   L1 = L
  834:                   L2 = L
  835:                   LNEXT = L - 1
  836:                END IF
  837:             END IF
  838: *
  839: *           Start row loop (index = K)
  840: *           K1 (K2): row index of the first (last) row of X(K,L)
  841: *
  842:             KNEXT = M
  843:             DO 230 K = M, 1, -1
  844:                IF( K.GT.KNEXT )
  845:      $            GO TO 230
  846:                IF( K.EQ.1 ) THEN
  847:                   K1 = K
  848:                   K2 = K
  849:                ELSE
  850:                   IF( A( K, K-1 ).NE.ZERO ) THEN
  851:                      K1 = K - 1
  852:                      K2 = K
  853:                      KNEXT = K - 2
  854:                   ELSE
  855:                      K1 = K
  856:                      K2 = K
  857:                      KNEXT = K - 1
  858:                   END IF
  859:                END IF
  860: *
  861:                IF( L1.EQ.L2 .AND. K1.EQ.K2 ) THEN
  862:                   SUML = DDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
  863:      $                   C( MIN( K1+1, M ), L1 ), 1 )
  864:                   SUMR = DDOT( N-L1, C( K1, MIN( L1+1, N ) ), LDC,
  865:      $                   B( L1, MIN( L1+1, N ) ), LDB )
  866:                   VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
  867:                   SCALOC = ONE
  868: *
  869:                   A11 = A( K1, K1 ) + SGN*B( L1, L1 )
  870:                   DA11 = ABS( A11 )
  871:                   IF( DA11.LE.SMIN ) THEN
  872:                      A11 = SMIN
  873:                      DA11 = SMIN
  874:                      INFO = 1
  875:                   END IF
  876:                   DB = ABS( VEC( 1, 1 ) )
  877:                   IF( DA11.LT.ONE .AND. DB.GT.ONE ) THEN
  878:                      IF( DB.GT.BIGNUM*DA11 )
  879:      $                  SCALOC = ONE / DB
  880:                   END IF
  881:                   X( 1, 1 ) = ( VEC( 1, 1 )*SCALOC ) / A11
  882: *
  883:                   IF( SCALOC.NE.ONE ) THEN
  884:                      DO 190 J = 1, N
  885:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  886:   190                CONTINUE
  887:                      SCALE = SCALE*SCALOC
  888:                   END IF
  889:                   C( K1, L1 ) = X( 1, 1 )
  890: *
  891:                ELSE IF( L1.EQ.L2 .AND. K1.NE.K2 ) THEN
  892: *
  893:                   SUML = DDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
  894:      $                   C( MIN( K2+1, M ), L1 ), 1 )
  895:                   SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
  896:      $                   B( L1, MIN( L2+1, N ) ), LDB )
  897:                   VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
  898: *
  899:                   SUML = DDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
  900:      $                   C( MIN( K2+1, M ), L1 ), 1 )
  901:                   SUMR = DDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
  902:      $                   B( L1, MIN( L2+1, N ) ), LDB )
  903:                   VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
  904: *
  905:                   CALL DLALN2( .FALSE., 2, 1, SMIN, ONE, A( K1, K1 ),
  906:      $                         LDA, ONE, ONE, VEC, 2, -SGN*B( L1, L1 ),
  907:      $                         ZERO, X, 2, SCALOC, XNORM, IERR )
  908:                   IF( IERR.NE.0 )
  909:      $               INFO = 1
  910: *
  911:                   IF( SCALOC.NE.ONE ) THEN
  912:                      DO 200 J = 1, N
  913:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  914:   200                CONTINUE
  915:                      SCALE = SCALE*SCALOC
  916:                   END IF
  917:                   C( K1, L1 ) = X( 1, 1 )
  918:                   C( K2, L1 ) = X( 2, 1 )
  919: *
  920:                ELSE IF( L1.NE.L2 .AND. K1.EQ.K2 ) THEN
  921: *
  922:                   SUML = DDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
  923:      $                   C( MIN( K1+1, M ), L1 ), 1 )
  924:                   SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
  925:      $                   B( L1, MIN( L2+1, N ) ), LDB )
  926:                   VEC( 1, 1 ) = SGN*( C( K1, L1 )-( SUML+SGN*SUMR ) )
  927: *
  928:                   SUML = DDOT( M-K1, A( K1, MIN( K1+1, M ) ), LDA,
  929:      $                   C( MIN( K1+1, M ), L2 ), 1 )
  930:                   SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
  931:      $                   B( L2, MIN( L2+1, N ) ), LDB )
  932:                   VEC( 2, 1 ) = SGN*( C( K1, L2 )-( SUML+SGN*SUMR ) )
  933: *
  934:                   CALL DLALN2( .FALSE., 2, 1, SMIN, ONE, B( L1, L1 ),
  935:      $                         LDB, ONE, ONE, VEC, 2, -SGN*A( K1, K1 ),
  936:      $                         ZERO, X, 2, SCALOC, XNORM, IERR )
  937:                   IF( IERR.NE.0 )
  938:      $               INFO = 1
  939: *
  940:                   IF( SCALOC.NE.ONE ) THEN
  941:                      DO 210 J = 1, N
  942:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  943:   210                CONTINUE
  944:                      SCALE = SCALE*SCALOC
  945:                   END IF
  946:                   C( K1, L1 ) = X( 1, 1 )
  947:                   C( K1, L2 ) = X( 2, 1 )
  948: *
  949:                ELSE IF( L1.NE.L2 .AND. K1.NE.K2 ) THEN
  950: *
  951:                   SUML = DDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
  952:      $                   C( MIN( K2+1, M ), L1 ), 1 )
  953:                   SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
  954:      $                   B( L1, MIN( L2+1, N ) ), LDB )
  955:                   VEC( 1, 1 ) = C( K1, L1 ) - ( SUML+SGN*SUMR )
  956: *
  957:                   SUML = DDOT( M-K2, A( K1, MIN( K2+1, M ) ), LDA,
  958:      $                   C( MIN( K2+1, M ), L2 ), 1 )
  959:                   SUMR = DDOT( N-L2, C( K1, MIN( L2+1, N ) ), LDC,
  960:      $                   B( L2, MIN( L2+1, N ) ), LDB )
  961:                   VEC( 1, 2 ) = C( K1, L2 ) - ( SUML+SGN*SUMR )
  962: *
  963:                   SUML = DDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
  964:      $                   C( MIN( K2+1, M ), L1 ), 1 )
  965:                   SUMR = DDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
  966:      $                   B( L1, MIN( L2+1, N ) ), LDB )
  967:                   VEC( 2, 1 ) = C( K2, L1 ) - ( SUML+SGN*SUMR )
  968: *
  969:                   SUML = DDOT( M-K2, A( K2, MIN( K2+1, M ) ), LDA,
  970:      $                   C( MIN( K2+1, M ), L2 ), 1 )
  971:                   SUMR = DDOT( N-L2, C( K2, MIN( L2+1, N ) ), LDC,
  972:      $                   B( L2, MIN( L2+1, N ) ), LDB )
  973:                   VEC( 2, 2 ) = C( K2, L2 ) - ( SUML+SGN*SUMR )
  974: *
  975:                   CALL DLASY2( .FALSE., .TRUE., ISGN, 2, 2, A( K1, K1 ),
  976:      $                         LDA, B( L1, L1 ), LDB, VEC, 2, SCALOC, X,
  977:      $                         2, XNORM, IERR )
  978:                   IF( IERR.NE.0 )
  979:      $               INFO = 1
  980: *
  981:                   IF( SCALOC.NE.ONE ) THEN
  982:                      DO 220 J = 1, N
  983:                         CALL DSCAL( M, SCALOC, C( 1, J ), 1 )
  984:   220                CONTINUE
  985:                      SCALE = SCALE*SCALOC
  986:                   END IF
  987:                   C( K1, L1 ) = X( 1, 1 )
  988:                   C( K1, L2 ) = X( 1, 2 )
  989:                   C( K2, L1 ) = X( 2, 1 )
  990:                   C( K2, L2 ) = X( 2, 2 )
  991:                END IF
  992: *
  993:   230       CONTINUE
  994:   240    CONTINUE
  995: *
  996:       END IF
  997: *
  998:       RETURN
  999: *
 1000: *     End of DTRSYL
 1001: *
 1002:       END

CVSweb interface <joel.bertrand@systella.fr>