Annotation of rpl/lapack/lapack/dlaqtr.f, revision 1.1

1.1     ! bertrand    1:       SUBROUTINE DLAQTR( LTRAN, LREAL, N, T, LDT, B, W, SCALE, X, WORK,
        !             2:      $                   INFO )
        !             3: *
        !             4: *  -- LAPACK auxiliary routine (version 3.2) --
        !             5: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
        !             6: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
        !             7: *     November 2006
        !             8: *
        !             9: *     .. Scalar Arguments ..
        !            10:       LOGICAL            LREAL, LTRAN
        !            11:       INTEGER            INFO, LDT, N
        !            12:       DOUBLE PRECISION   SCALE, W
        !            13: *     ..
        !            14: *     .. Array Arguments ..
        !            15:       DOUBLE PRECISION   B( * ), T( LDT, * ), WORK( * ), X( * )
        !            16: *     ..
        !            17: *
        !            18: *  Purpose
        !            19: *  =======
        !            20: *
        !            21: *  DLAQTR solves the real quasi-triangular system
        !            22: *
        !            23: *               op(T)*p = scale*c,               if LREAL = .TRUE.
        !            24: *
        !            25: *  or the complex quasi-triangular systems
        !            26: *
        !            27: *             op(T + iB)*(p+iq) = scale*(c+id),  if LREAL = .FALSE.
        !            28: *
        !            29: *  in real arithmetic, where T is upper quasi-triangular.
        !            30: *  If LREAL = .FALSE., then the first diagonal block of T must be
        !            31: *  1 by 1, B is the specially structured matrix
        !            32: *
        !            33: *                 B = [ b(1) b(2) ... b(n) ]
        !            34: *                     [       w            ]
        !            35: *                     [           w        ]
        !            36: *                     [              .     ]
        !            37: *                     [                 w  ]
        !            38: *
        !            39: *  op(A) = A or A', A' denotes the conjugate transpose of
        !            40: *  matrix A.
        !            41: *
        !            42: *  On input, X = [ c ].  On output, X = [ p ].
        !            43: *                [ d ]                  [ q ]
        !            44: *
        !            45: *  This subroutine is designed for the condition number estimation
        !            46: *  in routine DTRSNA.
        !            47: *
        !            48: *  Arguments
        !            49: *  =========
        !            50: *
        !            51: *  LTRAN   (input) LOGICAL
        !            52: *          On entry, LTRAN specifies the option of conjugate transpose:
        !            53: *             = .FALSE.,    op(T+i*B) = T+i*B,
        !            54: *             = .TRUE.,     op(T+i*B) = (T+i*B)'.
        !            55: *
        !            56: *  LREAL   (input) LOGICAL
        !            57: *          On entry, LREAL specifies the input matrix structure:
        !            58: *             = .FALSE.,    the input is complex
        !            59: *             = .TRUE.,     the input is real
        !            60: *
        !            61: *  N       (input) INTEGER
        !            62: *          On entry, N specifies the order of T+i*B. N >= 0.
        !            63: *
        !            64: *  T       (input) DOUBLE PRECISION array, dimension (LDT,N)
        !            65: *          On entry, T contains a matrix in Schur canonical form.
        !            66: *          If LREAL = .FALSE., then the first diagonal block of T mu
        !            67: *          be 1 by 1.
        !            68: *
        !            69: *  LDT     (input) INTEGER
        !            70: *          The leading dimension of the matrix T. LDT >= max(1,N).
        !            71: *
        !            72: *  B       (input) DOUBLE PRECISION array, dimension (N)
        !            73: *          On entry, B contains the elements to form the matrix
        !            74: *          B as described above.
        !            75: *          If LREAL = .TRUE., B is not referenced.
        !            76: *
        !            77: *  W       (input) DOUBLE PRECISION
        !            78: *          On entry, W is the diagonal element of the matrix B.
        !            79: *          If LREAL = .TRUE., W is not referenced.
        !            80: *
        !            81: *  SCALE   (output) DOUBLE PRECISION
        !            82: *          On exit, SCALE is the scale factor.
        !            83: *
        !            84: *  X       (input/output) DOUBLE PRECISION array, dimension (2*N)
        !            85: *          On entry, X contains the right hand side of the system.
        !            86: *          On exit, X is overwritten by the solution.
        !            87: *
        !            88: *  WORK    (workspace) DOUBLE PRECISION array, dimension (N)
        !            89: *
        !            90: *  INFO    (output) INTEGER
        !            91: *          On exit, INFO is set to
        !            92: *             0: successful exit.
        !            93: *               1: the some diagonal 1 by 1 block has been perturbed by
        !            94: *                  a small number SMIN to keep nonsingularity.
        !            95: *               2: the some diagonal 2 by 2 block has been perturbed by
        !            96: *                  a small number in DLALN2 to keep nonsingularity.
        !            97: *          NOTE: In the interests of speed, this routine does not
        !            98: *                check the inputs for errors.
        !            99: *
        !           100: * =====================================================================
        !           101: *
        !           102: *     .. Parameters ..
        !           103:       DOUBLE PRECISION   ZERO, ONE
        !           104:       PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
        !           105: *     ..
        !           106: *     .. Local Scalars ..
        !           107:       LOGICAL            NOTRAN
        !           108:       INTEGER            I, IERR, J, J1, J2, JNEXT, K, N1, N2
        !           109:       DOUBLE PRECISION   BIGNUM, EPS, REC, SCALOC, SI, SMIN, SMINW,
        !           110:      $                   SMLNUM, SR, TJJ, TMP, XJ, XMAX, XNORM, Z
        !           111: *     ..
        !           112: *     .. Local Arrays ..
        !           113:       DOUBLE PRECISION   D( 2, 2 ), V( 2, 2 )
        !           114: *     ..
        !           115: *     .. External Functions ..
        !           116:       INTEGER            IDAMAX
        !           117:       DOUBLE PRECISION   DASUM, DDOT, DLAMCH, DLANGE
        !           118:       EXTERNAL           IDAMAX, DASUM, DDOT, DLAMCH, DLANGE
        !           119: *     ..
        !           120: *     .. External Subroutines ..
        !           121:       EXTERNAL           DAXPY, DLADIV, DLALN2, DSCAL
        !           122: *     ..
        !           123: *     .. Intrinsic Functions ..
        !           124:       INTRINSIC          ABS, MAX
        !           125: *     ..
        !           126: *     .. Executable Statements ..
        !           127: *
        !           128: *     Do not test the input parameters for errors
        !           129: *
        !           130:       NOTRAN = .NOT.LTRAN
        !           131:       INFO = 0
        !           132: *
        !           133: *     Quick return if possible
        !           134: *
        !           135:       IF( N.EQ.0 )
        !           136:      $   RETURN
        !           137: *
        !           138: *     Set constants to control overflow
        !           139: *
        !           140:       EPS = DLAMCH( 'P' )
        !           141:       SMLNUM = DLAMCH( 'S' ) / EPS
        !           142:       BIGNUM = ONE / SMLNUM
        !           143: *
        !           144:       XNORM = DLANGE( 'M', N, N, T, LDT, D )
        !           145:       IF( .NOT.LREAL )
        !           146:      $   XNORM = MAX( XNORM, ABS( W ), DLANGE( 'M', N, 1, B, N, D ) )
        !           147:       SMIN = MAX( SMLNUM, EPS*XNORM )
        !           148: *
        !           149: *     Compute 1-norm of each column of strictly upper triangular
        !           150: *     part of T to control overflow in triangular solver.
        !           151: *
        !           152:       WORK( 1 ) = ZERO
        !           153:       DO 10 J = 2, N
        !           154:          WORK( J ) = DASUM( J-1, T( 1, J ), 1 )
        !           155:    10 CONTINUE
        !           156: *
        !           157:       IF( .NOT.LREAL ) THEN
        !           158:          DO 20 I = 2, N
        !           159:             WORK( I ) = WORK( I ) + ABS( B( I ) )
        !           160:    20    CONTINUE
        !           161:       END IF
        !           162: *
        !           163:       N2 = 2*N
        !           164:       N1 = N
        !           165:       IF( .NOT.LREAL )
        !           166:      $   N1 = N2
        !           167:       K = IDAMAX( N1, X, 1 )
        !           168:       XMAX = ABS( X( K ) )
        !           169:       SCALE = ONE
        !           170: *
        !           171:       IF( XMAX.GT.BIGNUM ) THEN
        !           172:          SCALE = BIGNUM / XMAX
        !           173:          CALL DSCAL( N1, SCALE, X, 1 )
        !           174:          XMAX = BIGNUM
        !           175:       END IF
        !           176: *
        !           177:       IF( LREAL ) THEN
        !           178: *
        !           179:          IF( NOTRAN ) THEN
        !           180: *
        !           181: *           Solve T*p = scale*c
        !           182: *
        !           183:             JNEXT = N
        !           184:             DO 30 J = N, 1, -1
        !           185:                IF( J.GT.JNEXT )
        !           186:      $            GO TO 30
        !           187:                J1 = J
        !           188:                J2 = J
        !           189:                JNEXT = J - 1
        !           190:                IF( J.GT.1 ) THEN
        !           191:                   IF( T( J, J-1 ).NE.ZERO ) THEN
        !           192:                      J1 = J - 1
        !           193:                      JNEXT = J - 2
        !           194:                   END IF
        !           195:                END IF
        !           196: *
        !           197:                IF( J1.EQ.J2 ) THEN
        !           198: *
        !           199: *                 Meet 1 by 1 diagonal block
        !           200: *
        !           201: *                 Scale to avoid overflow when computing
        !           202: *                     x(j) = b(j)/T(j,j)
        !           203: *
        !           204:                   XJ = ABS( X( J1 ) )
        !           205:                   TJJ = ABS( T( J1, J1 ) )
        !           206:                   TMP = T( J1, J1 )
        !           207:                   IF( TJJ.LT.SMIN ) THEN
        !           208:                      TMP = SMIN
        !           209:                      TJJ = SMIN
        !           210:                      INFO = 1
        !           211:                   END IF
        !           212: *
        !           213:                   IF( XJ.EQ.ZERO )
        !           214:      $               GO TO 30
        !           215: *
        !           216:                   IF( TJJ.LT.ONE ) THEN
        !           217:                      IF( XJ.GT.BIGNUM*TJJ ) THEN
        !           218:                         REC = ONE / XJ
        !           219:                         CALL DSCAL( N, REC, X, 1 )
        !           220:                         SCALE = SCALE*REC
        !           221:                         XMAX = XMAX*REC
        !           222:                      END IF
        !           223:                   END IF
        !           224:                   X( J1 ) = X( J1 ) / TMP
        !           225:                   XJ = ABS( X( J1 ) )
        !           226: *
        !           227: *                 Scale x if necessary to avoid overflow when adding a
        !           228: *                 multiple of column j1 of T.
        !           229: *
        !           230:                   IF( XJ.GT.ONE ) THEN
        !           231:                      REC = ONE / XJ
        !           232:                      IF( WORK( J1 ).GT.( BIGNUM-XMAX )*REC ) THEN
        !           233:                         CALL DSCAL( N, REC, X, 1 )
        !           234:                         SCALE = SCALE*REC
        !           235:                      END IF
        !           236:                   END IF
        !           237:                   IF( J1.GT.1 ) THEN
        !           238:                      CALL DAXPY( J1-1, -X( J1 ), T( 1, J1 ), 1, X, 1 )
        !           239:                      K = IDAMAX( J1-1, X, 1 )
        !           240:                      XMAX = ABS( X( K ) )
        !           241:                   END IF
        !           242: *
        !           243:                ELSE
        !           244: *
        !           245: *                 Meet 2 by 2 diagonal block
        !           246: *
        !           247: *                 Call 2 by 2 linear system solve, to take
        !           248: *                 care of possible overflow by scaling factor.
        !           249: *
        !           250:                   D( 1, 1 ) = X( J1 )
        !           251:                   D( 2, 1 ) = X( J2 )
        !           252:                   CALL DLALN2( .FALSE., 2, 1, SMIN, ONE, T( J1, J1 ),
        !           253:      $                         LDT, ONE, ONE, D, 2, ZERO, ZERO, V, 2,
        !           254:      $                         SCALOC, XNORM, IERR )
        !           255:                   IF( IERR.NE.0 )
        !           256:      $               INFO = 2
        !           257: *
        !           258:                   IF( SCALOC.NE.ONE ) THEN
        !           259:                      CALL DSCAL( N, SCALOC, X, 1 )
        !           260:                      SCALE = SCALE*SCALOC
        !           261:                   END IF
        !           262:                   X( J1 ) = V( 1, 1 )
        !           263:                   X( J2 ) = V( 2, 1 )
        !           264: *
        !           265: *                 Scale V(1,1) (= X(J1)) and/or V(2,1) (=X(J2))
        !           266: *                 to avoid overflow in updating right-hand side.
        !           267: *
        !           268:                   XJ = MAX( ABS( V( 1, 1 ) ), ABS( V( 2, 1 ) ) )
        !           269:                   IF( XJ.GT.ONE ) THEN
        !           270:                      REC = ONE / XJ
        !           271:                      IF( MAX( WORK( J1 ), WORK( J2 ) ).GT.
        !           272:      $                   ( BIGNUM-XMAX )*REC ) THEN
        !           273:                         CALL DSCAL( N, REC, X, 1 )
        !           274:                         SCALE = SCALE*REC
        !           275:                      END IF
        !           276:                   END IF
        !           277: *
        !           278: *                 Update right-hand side
        !           279: *
        !           280:                   IF( J1.GT.1 ) THEN
        !           281:                      CALL DAXPY( J1-1, -X( J1 ), T( 1, J1 ), 1, X, 1 )
        !           282:                      CALL DAXPY( J1-1, -X( J2 ), T( 1, J2 ), 1, X, 1 )
        !           283:                      K = IDAMAX( J1-1, X, 1 )
        !           284:                      XMAX = ABS( X( K ) )
        !           285:                   END IF
        !           286: *
        !           287:                END IF
        !           288: *
        !           289:    30       CONTINUE
        !           290: *
        !           291:          ELSE
        !           292: *
        !           293: *           Solve T'*p = scale*c
        !           294: *
        !           295:             JNEXT = 1
        !           296:             DO 40 J = 1, N
        !           297:                IF( J.LT.JNEXT )
        !           298:      $            GO TO 40
        !           299:                J1 = J
        !           300:                J2 = J
        !           301:                JNEXT = J + 1
        !           302:                IF( J.LT.N ) THEN
        !           303:                   IF( T( J+1, J ).NE.ZERO ) THEN
        !           304:                      J2 = J + 1
        !           305:                      JNEXT = J + 2
        !           306:                   END IF
        !           307:                END IF
        !           308: *
        !           309:                IF( J1.EQ.J2 ) THEN
        !           310: *
        !           311: *                 1 by 1 diagonal block
        !           312: *
        !           313: *                 Scale if necessary to avoid overflow in forming the
        !           314: *                 right-hand side element by inner product.
        !           315: *
        !           316:                   XJ = ABS( X( J1 ) )
        !           317:                   IF( XMAX.GT.ONE ) THEN
        !           318:                      REC = ONE / XMAX
        !           319:                      IF( WORK( J1 ).GT.( BIGNUM-XJ )*REC ) THEN
        !           320:                         CALL DSCAL( N, REC, X, 1 )
        !           321:                         SCALE = SCALE*REC
        !           322:                         XMAX = XMAX*REC
        !           323:                      END IF
        !           324:                   END IF
        !           325: *
        !           326:                   X( J1 ) = X( J1 ) - DDOT( J1-1, T( 1, J1 ), 1, X, 1 )
        !           327: *
        !           328:                   XJ = ABS( X( J1 ) )
        !           329:                   TJJ = ABS( T( J1, J1 ) )
        !           330:                   TMP = T( J1, J1 )
        !           331:                   IF( TJJ.LT.SMIN ) THEN
        !           332:                      TMP = SMIN
        !           333:                      TJJ = SMIN
        !           334:                      INFO = 1
        !           335:                   END IF
        !           336: *
        !           337:                   IF( TJJ.LT.ONE ) THEN
        !           338:                      IF( XJ.GT.BIGNUM*TJJ ) THEN
        !           339:                         REC = ONE / XJ
        !           340:                         CALL DSCAL( N, REC, X, 1 )
        !           341:                         SCALE = SCALE*REC
        !           342:                         XMAX = XMAX*REC
        !           343:                      END IF
        !           344:                   END IF
        !           345:                   X( J1 ) = X( J1 ) / TMP
        !           346:                   XMAX = MAX( XMAX, ABS( X( J1 ) ) )
        !           347: *
        !           348:                ELSE
        !           349: *
        !           350: *                 2 by 2 diagonal block
        !           351: *
        !           352: *                 Scale if necessary to avoid overflow in forming the
        !           353: *                 right-hand side elements by inner product.
        !           354: *
        !           355:                   XJ = MAX( ABS( X( J1 ) ), ABS( X( J2 ) ) )
        !           356:                   IF( XMAX.GT.ONE ) THEN
        !           357:                      REC = ONE / XMAX
        !           358:                      IF( MAX( WORK( J2 ), WORK( J1 ) ).GT.( BIGNUM-XJ )*
        !           359:      $                   REC ) THEN
        !           360:                         CALL DSCAL( N, REC, X, 1 )
        !           361:                         SCALE = SCALE*REC
        !           362:                         XMAX = XMAX*REC
        !           363:                      END IF
        !           364:                   END IF
        !           365: *
        !           366:                   D( 1, 1 ) = X( J1 ) - DDOT( J1-1, T( 1, J1 ), 1, X,
        !           367:      $                        1 )
        !           368:                   D( 2, 1 ) = X( J2 ) - DDOT( J1-1, T( 1, J2 ), 1, X,
        !           369:      $                        1 )
        !           370: *
        !           371:                   CALL DLALN2( .TRUE., 2, 1, SMIN, ONE, T( J1, J1 ),
        !           372:      $                         LDT, ONE, ONE, D, 2, ZERO, ZERO, V, 2,
        !           373:      $                         SCALOC, XNORM, IERR )
        !           374:                   IF( IERR.NE.0 )
        !           375:      $               INFO = 2
        !           376: *
        !           377:                   IF( SCALOC.NE.ONE ) THEN
        !           378:                      CALL DSCAL( N, SCALOC, X, 1 )
        !           379:                      SCALE = SCALE*SCALOC
        !           380:                   END IF
        !           381:                   X( J1 ) = V( 1, 1 )
        !           382:                   X( J2 ) = V( 2, 1 )
        !           383:                   XMAX = MAX( ABS( X( J1 ) ), ABS( X( J2 ) ), XMAX )
        !           384: *
        !           385:                END IF
        !           386:    40       CONTINUE
        !           387:          END IF
        !           388: *
        !           389:       ELSE
        !           390: *
        !           391:          SMINW = MAX( EPS*ABS( W ), SMIN )
        !           392:          IF( NOTRAN ) THEN
        !           393: *
        !           394: *           Solve (T + iB)*(p+iq) = c+id
        !           395: *
        !           396:             JNEXT = N
        !           397:             DO 70 J = N, 1, -1
        !           398:                IF( J.GT.JNEXT )
        !           399:      $            GO TO 70
        !           400:                J1 = J
        !           401:                J2 = J
        !           402:                JNEXT = J - 1
        !           403:                IF( J.GT.1 ) THEN
        !           404:                   IF( T( J, J-1 ).NE.ZERO ) THEN
        !           405:                      J1 = J - 1
        !           406:                      JNEXT = J - 2
        !           407:                   END IF
        !           408:                END IF
        !           409: *
        !           410:                IF( J1.EQ.J2 ) THEN
        !           411: *
        !           412: *                 1 by 1 diagonal block
        !           413: *
        !           414: *                 Scale if necessary to avoid overflow in division
        !           415: *
        !           416:                   Z = W
        !           417:                   IF( J1.EQ.1 )
        !           418:      $               Z = B( 1 )
        !           419:                   XJ = ABS( X( J1 ) ) + ABS( X( N+J1 ) )
        !           420:                   TJJ = ABS( T( J1, J1 ) ) + ABS( Z )
        !           421:                   TMP = T( J1, J1 )
        !           422:                   IF( TJJ.LT.SMINW ) THEN
        !           423:                      TMP = SMINW
        !           424:                      TJJ = SMINW
        !           425:                      INFO = 1
        !           426:                   END IF
        !           427: *
        !           428:                   IF( XJ.EQ.ZERO )
        !           429:      $               GO TO 70
        !           430: *
        !           431:                   IF( TJJ.LT.ONE ) THEN
        !           432:                      IF( XJ.GT.BIGNUM*TJJ ) THEN
        !           433:                         REC = ONE / XJ
        !           434:                         CALL DSCAL( N2, REC, X, 1 )
        !           435:                         SCALE = SCALE*REC
        !           436:                         XMAX = XMAX*REC
        !           437:                      END IF
        !           438:                   END IF
        !           439:                   CALL DLADIV( X( J1 ), X( N+J1 ), TMP, Z, SR, SI )
        !           440:                   X( J1 ) = SR
        !           441:                   X( N+J1 ) = SI
        !           442:                   XJ = ABS( X( J1 ) ) + ABS( X( N+J1 ) )
        !           443: *
        !           444: *                 Scale x if necessary to avoid overflow when adding a
        !           445: *                 multiple of column j1 of T.
        !           446: *
        !           447:                   IF( XJ.GT.ONE ) THEN
        !           448:                      REC = ONE / XJ
        !           449:                      IF( WORK( J1 ).GT.( BIGNUM-XMAX )*REC ) THEN
        !           450:                         CALL DSCAL( N2, REC, X, 1 )
        !           451:                         SCALE = SCALE*REC
        !           452:                      END IF
        !           453:                   END IF
        !           454: *
        !           455:                   IF( J1.GT.1 ) THEN
        !           456:                      CALL DAXPY( J1-1, -X( J1 ), T( 1, J1 ), 1, X, 1 )
        !           457:                      CALL DAXPY( J1-1, -X( N+J1 ), T( 1, J1 ), 1,
        !           458:      $                           X( N+1 ), 1 )
        !           459: *
        !           460:                      X( 1 ) = X( 1 ) + B( J1 )*X( N+J1 )
        !           461:                      X( N+1 ) = X( N+1 ) - B( J1 )*X( J1 )
        !           462: *
        !           463:                      XMAX = ZERO
        !           464:                      DO 50 K = 1, J1 - 1
        !           465:                         XMAX = MAX( XMAX, ABS( X( K ) )+
        !           466:      $                         ABS( X( K+N ) ) )
        !           467:    50                CONTINUE
        !           468:                   END IF
        !           469: *
        !           470:                ELSE
        !           471: *
        !           472: *                 Meet 2 by 2 diagonal block
        !           473: *
        !           474:                   D( 1, 1 ) = X( J1 )
        !           475:                   D( 2, 1 ) = X( J2 )
        !           476:                   D( 1, 2 ) = X( N+J1 )
        !           477:                   D( 2, 2 ) = X( N+J2 )
        !           478:                   CALL DLALN2( .FALSE., 2, 2, SMINW, ONE, T( J1, J1 ),
        !           479:      $                         LDT, ONE, ONE, D, 2, ZERO, -W, V, 2,
        !           480:      $                         SCALOC, XNORM, IERR )
        !           481:                   IF( IERR.NE.0 )
        !           482:      $               INFO = 2
        !           483: *
        !           484:                   IF( SCALOC.NE.ONE ) THEN
        !           485:                      CALL DSCAL( 2*N, SCALOC, X, 1 )
        !           486:                      SCALE = SCALOC*SCALE
        !           487:                   END IF
        !           488:                   X( J1 ) = V( 1, 1 )
        !           489:                   X( J2 ) = V( 2, 1 )
        !           490:                   X( N+J1 ) = V( 1, 2 )
        !           491:                   X( N+J2 ) = V( 2, 2 )
        !           492: *
        !           493: *                 Scale X(J1), .... to avoid overflow in
        !           494: *                 updating right hand side.
        !           495: *
        !           496:                   XJ = MAX( ABS( V( 1, 1 ) )+ABS( V( 1, 2 ) ),
        !           497:      $                 ABS( V( 2, 1 ) )+ABS( V( 2, 2 ) ) )
        !           498:                   IF( XJ.GT.ONE ) THEN
        !           499:                      REC = ONE / XJ
        !           500:                      IF( MAX( WORK( J1 ), WORK( J2 ) ).GT.
        !           501:      $                   ( BIGNUM-XMAX )*REC ) THEN
        !           502:                         CALL DSCAL( N2, REC, X, 1 )
        !           503:                         SCALE = SCALE*REC
        !           504:                      END IF
        !           505:                   END IF
        !           506: *
        !           507: *                 Update the right-hand side.
        !           508: *
        !           509:                   IF( J1.GT.1 ) THEN
        !           510:                      CALL DAXPY( J1-1, -X( J1 ), T( 1, J1 ), 1, X, 1 )
        !           511:                      CALL DAXPY( J1-1, -X( J2 ), T( 1, J2 ), 1, X, 1 )
        !           512: *
        !           513:                      CALL DAXPY( J1-1, -X( N+J1 ), T( 1, J1 ), 1,
        !           514:      $                           X( N+1 ), 1 )
        !           515:                      CALL DAXPY( J1-1, -X( N+J2 ), T( 1, J2 ), 1,
        !           516:      $                           X( N+1 ), 1 )
        !           517: *
        !           518:                      X( 1 ) = X( 1 ) + B( J1 )*X( N+J1 ) +
        !           519:      $                        B( J2 )*X( N+J2 )
        !           520:                      X( N+1 ) = X( N+1 ) - B( J1 )*X( J1 ) -
        !           521:      $                          B( J2 )*X( J2 )
        !           522: *
        !           523:                      XMAX = ZERO
        !           524:                      DO 60 K = 1, J1 - 1
        !           525:                         XMAX = MAX( ABS( X( K ) )+ABS( X( K+N ) ),
        !           526:      $                         XMAX )
        !           527:    60                CONTINUE
        !           528:                   END IF
        !           529: *
        !           530:                END IF
        !           531:    70       CONTINUE
        !           532: *
        !           533:          ELSE
        !           534: *
        !           535: *           Solve (T + iB)'*(p+iq) = c+id
        !           536: *
        !           537:             JNEXT = 1
        !           538:             DO 80 J = 1, N
        !           539:                IF( J.LT.JNEXT )
        !           540:      $            GO TO 80
        !           541:                J1 = J
        !           542:                J2 = J
        !           543:                JNEXT = J + 1
        !           544:                IF( J.LT.N ) THEN
        !           545:                   IF( T( J+1, J ).NE.ZERO ) THEN
        !           546:                      J2 = J + 1
        !           547:                      JNEXT = J + 2
        !           548:                   END IF
        !           549:                END IF
        !           550: *
        !           551:                IF( J1.EQ.J2 ) THEN
        !           552: *
        !           553: *                 1 by 1 diagonal block
        !           554: *
        !           555: *                 Scale if necessary to avoid overflow in forming the
        !           556: *                 right-hand side element by inner product.
        !           557: *
        !           558:                   XJ = ABS( X( J1 ) ) + ABS( X( J1+N ) )
        !           559:                   IF( XMAX.GT.ONE ) THEN
        !           560:                      REC = ONE / XMAX
        !           561:                      IF( WORK( J1 ).GT.( BIGNUM-XJ )*REC ) THEN
        !           562:                         CALL DSCAL( N2, REC, X, 1 )
        !           563:                         SCALE = SCALE*REC
        !           564:                         XMAX = XMAX*REC
        !           565:                      END IF
        !           566:                   END IF
        !           567: *
        !           568:                   X( J1 ) = X( J1 ) - DDOT( J1-1, T( 1, J1 ), 1, X, 1 )
        !           569:                   X( N+J1 ) = X( N+J1 ) - DDOT( J1-1, T( 1, J1 ), 1,
        !           570:      $                        X( N+1 ), 1 )
        !           571:                   IF( J1.GT.1 ) THEN
        !           572:                      X( J1 ) = X( J1 ) - B( J1 )*X( N+1 )
        !           573:                      X( N+J1 ) = X( N+J1 ) + B( J1 )*X( 1 )
        !           574:                   END IF
        !           575:                   XJ = ABS( X( J1 ) ) + ABS( X( J1+N ) )
        !           576: *
        !           577:                   Z = W
        !           578:                   IF( J1.EQ.1 )
        !           579:      $               Z = B( 1 )
        !           580: *
        !           581: *                 Scale if necessary to avoid overflow in
        !           582: *                 complex division
        !           583: *
        !           584:                   TJJ = ABS( T( J1, J1 ) ) + ABS( Z )
        !           585:                   TMP = T( J1, J1 )
        !           586:                   IF( TJJ.LT.SMINW ) THEN
        !           587:                      TMP = SMINW
        !           588:                      TJJ = SMINW
        !           589:                      INFO = 1
        !           590:                   END IF
        !           591: *
        !           592:                   IF( TJJ.LT.ONE ) THEN
        !           593:                      IF( XJ.GT.BIGNUM*TJJ ) THEN
        !           594:                         REC = ONE / XJ
        !           595:                         CALL DSCAL( N2, REC, X, 1 )
        !           596:                         SCALE = SCALE*REC
        !           597:                         XMAX = XMAX*REC
        !           598:                      END IF
        !           599:                   END IF
        !           600:                   CALL DLADIV( X( J1 ), X( N+J1 ), TMP, -Z, SR, SI )
        !           601:                   X( J1 ) = SR
        !           602:                   X( J1+N ) = SI
        !           603:                   XMAX = MAX( ABS( X( J1 ) )+ABS( X( J1+N ) ), XMAX )
        !           604: *
        !           605:                ELSE
        !           606: *
        !           607: *                 2 by 2 diagonal block
        !           608: *
        !           609: *                 Scale if necessary to avoid overflow in forming the
        !           610: *                 right-hand side element by inner product.
        !           611: *
        !           612:                   XJ = MAX( ABS( X( J1 ) )+ABS( X( N+J1 ) ),
        !           613:      $                 ABS( X( J2 ) )+ABS( X( N+J2 ) ) )
        !           614:                   IF( XMAX.GT.ONE ) THEN
        !           615:                      REC = ONE / XMAX
        !           616:                      IF( MAX( WORK( J1 ), WORK( J2 ) ).GT.
        !           617:      $                   ( BIGNUM-XJ ) / XMAX ) THEN
        !           618:                         CALL DSCAL( N2, REC, X, 1 )
        !           619:                         SCALE = SCALE*REC
        !           620:                         XMAX = XMAX*REC
        !           621:                      END IF
        !           622:                   END IF
        !           623: *
        !           624:                   D( 1, 1 ) = X( J1 ) - DDOT( J1-1, T( 1, J1 ), 1, X,
        !           625:      $                        1 )
        !           626:                   D( 2, 1 ) = X( J2 ) - DDOT( J1-1, T( 1, J2 ), 1, X,
        !           627:      $                        1 )
        !           628:                   D( 1, 2 ) = X( N+J1 ) - DDOT( J1-1, T( 1, J1 ), 1,
        !           629:      $                        X( N+1 ), 1 )
        !           630:                   D( 2, 2 ) = X( N+J2 ) - DDOT( J1-1, T( 1, J2 ), 1,
        !           631:      $                        X( N+1 ), 1 )
        !           632:                   D( 1, 1 ) = D( 1, 1 ) - B( J1 )*X( N+1 )
        !           633:                   D( 2, 1 ) = D( 2, 1 ) - B( J2 )*X( N+1 )
        !           634:                   D( 1, 2 ) = D( 1, 2 ) + B( J1 )*X( 1 )
        !           635:                   D( 2, 2 ) = D( 2, 2 ) + B( J2 )*X( 1 )
        !           636: *
        !           637:                   CALL DLALN2( .TRUE., 2, 2, SMINW, ONE, T( J1, J1 ),
        !           638:      $                         LDT, ONE, ONE, D, 2, ZERO, W, V, 2,
        !           639:      $                         SCALOC, XNORM, IERR )
        !           640:                   IF( IERR.NE.0 )
        !           641:      $               INFO = 2
        !           642: *
        !           643:                   IF( SCALOC.NE.ONE ) THEN
        !           644:                      CALL DSCAL( N2, SCALOC, X, 1 )
        !           645:                      SCALE = SCALOC*SCALE
        !           646:                   END IF
        !           647:                   X( J1 ) = V( 1, 1 )
        !           648:                   X( J2 ) = V( 2, 1 )
        !           649:                   X( N+J1 ) = V( 1, 2 )
        !           650:                   X( N+J2 ) = V( 2, 2 )
        !           651:                   XMAX = MAX( ABS( X( J1 ) )+ABS( X( N+J1 ) ),
        !           652:      $                   ABS( X( J2 ) )+ABS( X( N+J2 ) ), XMAX )
        !           653: *
        !           654:                END IF
        !           655: *
        !           656:    80       CONTINUE
        !           657: *
        !           658:          END IF
        !           659: *
        !           660:       END IF
        !           661: *
        !           662:       RETURN
        !           663: *
        !           664: *     End of DLAQTR
        !           665: *
        !           666:       END

CVSweb interface <joel.bertrand@systella.fr>