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

1.1     ! bertrand    1:       SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
        !             2:      $                   T, LDT, C, LDC, WORK, LDWORK )
        !             3:       IMPLICIT NONE
        !             4: *
        !             5: *  -- LAPACK auxiliary routine (version 3.2) --
        !             6: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
        !             7: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
        !             8: *     November 2006
        !             9: *
        !            10: *     .. Scalar Arguments ..
        !            11:       CHARACTER          DIRECT, SIDE, STOREV, TRANS
        !            12:       INTEGER            K, LDC, LDT, LDV, LDWORK, M, N
        !            13: *     ..
        !            14: *     .. Array Arguments ..
        !            15:       DOUBLE PRECISION   C( LDC, * ), T( LDT, * ), V( LDV, * ),
        !            16:      $                   WORK( LDWORK, * )
        !            17: *     ..
        !            18: *
        !            19: *  Purpose
        !            20: *  =======
        !            21: *
        !            22: *  DLARFB applies a real block reflector H or its transpose H' to a
        !            23: *  real m by n matrix C, from either the left or the right.
        !            24: *
        !            25: *  Arguments
        !            26: *  =========
        !            27: *
        !            28: *  SIDE    (input) CHARACTER*1
        !            29: *          = 'L': apply H or H' from the Left
        !            30: *          = 'R': apply H or H' from the Right
        !            31: *
        !            32: *  TRANS   (input) CHARACTER*1
        !            33: *          = 'N': apply H (No transpose)
        !            34: *          = 'T': apply H' (Transpose)
        !            35: *
        !            36: *  DIRECT  (input) CHARACTER*1
        !            37: *          Indicates how H is formed from a product of elementary
        !            38: *          reflectors
        !            39: *          = 'F': H = H(1) H(2) . . . H(k) (Forward)
        !            40: *          = 'B': H = H(k) . . . H(2) H(1) (Backward)
        !            41: *
        !            42: *  STOREV  (input) CHARACTER*1
        !            43: *          Indicates how the vectors which define the elementary
        !            44: *          reflectors are stored:
        !            45: *          = 'C': Columnwise
        !            46: *          = 'R': Rowwise
        !            47: *
        !            48: *  M       (input) INTEGER
        !            49: *          The number of rows of the matrix C.
        !            50: *
        !            51: *  N       (input) INTEGER
        !            52: *          The number of columns of the matrix C.
        !            53: *
        !            54: *  K       (input) INTEGER
        !            55: *          The order of the matrix T (= the number of elementary
        !            56: *          reflectors whose product defines the block reflector).
        !            57: *
        !            58: *  V       (input) DOUBLE PRECISION array, dimension
        !            59: *                                (LDV,K) if STOREV = 'C'
        !            60: *                                (LDV,M) if STOREV = 'R' and SIDE = 'L'
        !            61: *                                (LDV,N) if STOREV = 'R' and SIDE = 'R'
        !            62: *          The matrix V. See further details.
        !            63: *
        !            64: *  LDV     (input) INTEGER
        !            65: *          The leading dimension of the array V.
        !            66: *          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);
        !            67: *          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);
        !            68: *          if STOREV = 'R', LDV >= K.
        !            69: *
        !            70: *  T       (input) DOUBLE PRECISION array, dimension (LDT,K)
        !            71: *          The triangular k by k matrix T in the representation of the
        !            72: *          block reflector.
        !            73: *
        !            74: *  LDT     (input) INTEGER
        !            75: *          The leading dimension of the array T. LDT >= K.
        !            76: *
        !            77: *  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
        !            78: *          On entry, the m by n matrix C.
        !            79: *          On exit, C is overwritten by H*C or H'*C or C*H or C*H'.
        !            80: *
        !            81: *  LDC     (input) INTEGER
        !            82: *          The leading dimension of the array C. LDA >= max(1,M).
        !            83: *
        !            84: *  WORK    (workspace) DOUBLE PRECISION array, dimension (LDWORK,K)
        !            85: *
        !            86: *  LDWORK  (input) INTEGER
        !            87: *          The leading dimension of the array WORK.
        !            88: *          If SIDE = 'L', LDWORK >= max(1,N);
        !            89: *          if SIDE = 'R', LDWORK >= max(1,M).
        !            90: *
        !            91: *  =====================================================================
        !            92: *
        !            93: *     .. Parameters ..
        !            94:       DOUBLE PRECISION   ONE
        !            95:       PARAMETER          ( ONE = 1.0D+0 )
        !            96: *     ..
        !            97: *     .. Local Scalars ..
        !            98:       CHARACTER          TRANST
        !            99:       INTEGER            I, J, LASTV, LASTC
        !           100: *     ..
        !           101: *     .. External Functions ..
        !           102:       LOGICAL            LSAME
        !           103:       INTEGER            ILADLR, ILADLC
        !           104:       EXTERNAL           LSAME, ILADLR, ILADLC
        !           105: *     ..
        !           106: *     .. External Subroutines ..
        !           107:       EXTERNAL           DCOPY, DGEMM, DTRMM
        !           108: *     ..
        !           109: *     .. Executable Statements ..
        !           110: *
        !           111: *     Quick return if possible
        !           112: *
        !           113:       IF( M.LE.0 .OR. N.LE.0 )
        !           114:      $   RETURN
        !           115: *
        !           116:       IF( LSAME( TRANS, 'N' ) ) THEN
        !           117:          TRANST = 'T'
        !           118:       ELSE
        !           119:          TRANST = 'N'
        !           120:       END IF
        !           121: *
        !           122:       IF( LSAME( STOREV, 'C' ) ) THEN
        !           123: *
        !           124:          IF( LSAME( DIRECT, 'F' ) ) THEN
        !           125: *
        !           126: *           Let  V =  ( V1 )    (first K rows)
        !           127: *                     ( V2 )
        !           128: *           where  V1  is unit lower triangular.
        !           129: *
        !           130:             IF( LSAME( SIDE, 'L' ) ) THEN
        !           131: *
        !           132: *              Form  H * C  or  H' * C  where  C = ( C1 )
        !           133: *                                                  ( C2 )
        !           134: *
        !           135:                LASTV = MAX( K, ILADLR( M, K, V, LDV ) )
        !           136:                LASTC = ILADLC( LASTV, N, C, LDC )
        !           137: *
        !           138: *              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
        !           139: *
        !           140: *              W := C1'
        !           141: *
        !           142:                DO 10 J = 1, K
        !           143:                   CALL DCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )
        !           144:    10          CONTINUE
        !           145: *
        !           146: *              W := W * V1
        !           147: *
        !           148:                CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
        !           149:      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
        !           150:                IF( LASTV.GT.K ) THEN
        !           151: *
        !           152: *                 W := W + C2'*V2
        !           153: *
        !           154:                   CALL DGEMM( 'Transpose', 'No transpose',
        !           155:      $                 LASTC, K, LASTV-K,
        !           156:      $                 ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV,
        !           157:      $                 ONE, WORK, LDWORK )
        !           158:                END IF
        !           159: *
        !           160: *              W := W * T'  or  W * T
        !           161: *
        !           162:                CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit',
        !           163:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
        !           164: *
        !           165: *              C := C - V * W'
        !           166: *
        !           167:                IF( LASTV.GT.K ) THEN
        !           168: *
        !           169: *                 C2 := C2 - V2 * W'
        !           170: *
        !           171:                   CALL DGEMM( 'No transpose', 'Transpose',
        !           172:      $                 LASTV-K, LASTC, K,
        !           173:      $                 -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE,
        !           174:      $                 C( K+1, 1 ), LDC )
        !           175:                END IF
        !           176: *
        !           177: *              W := W * V1'
        !           178: *
        !           179:                CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',
        !           180:      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
        !           181: *
        !           182: *              C1 := C1 - W'
        !           183: *
        !           184:                DO 30 J = 1, K
        !           185:                   DO 20 I = 1, LASTC
        !           186:                      C( J, I ) = C( J, I ) - WORK( I, J )
        !           187:    20             CONTINUE
        !           188:    30          CONTINUE
        !           189: *
        !           190:             ELSE IF( LSAME( SIDE, 'R' ) ) THEN
        !           191: *
        !           192: *              Form  C * H  or  C * H'  where  C = ( C1  C2 )
        !           193: *
        !           194:                LASTV = MAX( K, ILADLR( N, K, V, LDV ) )
        !           195:                LASTC = ILADLR( M, LASTV, C, LDC )
        !           196: *
        !           197: *              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
        !           198: *
        !           199: *              W := C1
        !           200: *
        !           201:                DO 40 J = 1, K
        !           202:                   CALL DCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )
        !           203:    40          CONTINUE
        !           204: *
        !           205: *              W := W * V1
        !           206: *
        !           207:                CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
        !           208:      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
        !           209:                IF( LASTV.GT.K ) THEN
        !           210: *
        !           211: *                 W := W + C2 * V2
        !           212: *
        !           213:                   CALL DGEMM( 'No transpose', 'No transpose',
        !           214:      $                 LASTC, K, LASTV-K,
        !           215:      $                 ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
        !           216:      $                 ONE, WORK, LDWORK )
        !           217:                END IF
        !           218: *
        !           219: *              W := W * T  or  W * T'
        !           220: *
        !           221:                CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit',
        !           222:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
        !           223: *
        !           224: *              C := C - W * V'
        !           225: *
        !           226:                IF( LASTV.GT.K ) THEN
        !           227: *
        !           228: *                 C2 := C2 - W * V2'
        !           229: *
        !           230:                   CALL DGEMM( 'No transpose', 'Transpose',
        !           231:      $                 LASTC, LASTV-K, K,
        !           232:      $                 -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE,
        !           233:      $                 C( 1, K+1 ), LDC )
        !           234:                END IF
        !           235: *
        !           236: *              W := W * V1'
        !           237: *
        !           238:                CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',
        !           239:      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
        !           240: *
        !           241: *              C1 := C1 - W
        !           242: *
        !           243:                DO 60 J = 1, K
        !           244:                   DO 50 I = 1, LASTC
        !           245:                      C( I, J ) = C( I, J ) - WORK( I, J )
        !           246:    50             CONTINUE
        !           247:    60          CONTINUE
        !           248:             END IF
        !           249: *
        !           250:          ELSE
        !           251: *
        !           252: *           Let  V =  ( V1 )
        !           253: *                     ( V2 )    (last K rows)
        !           254: *           where  V2  is unit upper triangular.
        !           255: *
        !           256:             IF( LSAME( SIDE, 'L' ) ) THEN
        !           257: *
        !           258: *              Form  H * C  or  H' * C  where  C = ( C1 )
        !           259: *                                                  ( C2 )
        !           260: *
        !           261:                LASTV = MAX( K, ILADLR( M, K, V, LDV ) )
        !           262:                LASTC = ILADLC( LASTV, N, C, LDC )
        !           263: *
        !           264: *              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
        !           265: *
        !           266: *              W := C2'
        !           267: *
        !           268:                DO 70 J = 1, K
        !           269:                   CALL DCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,
        !           270:      $                 WORK( 1, J ), 1 )
        !           271:    70          CONTINUE
        !           272: *
        !           273: *              W := W * V2
        !           274: *
        !           275:                CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
        !           276:      $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
        !           277:      $              WORK, LDWORK )
        !           278:                IF( LASTV.GT.K ) THEN
        !           279: *
        !           280: *                 W := W + C1'*V1
        !           281: *
        !           282:                   CALL DGEMM( 'Transpose', 'No transpose',
        !           283:      $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,
        !           284:      $                 ONE, WORK, LDWORK )
        !           285:                END IF
        !           286: *
        !           287: *              W := W * T'  or  W * T
        !           288: *
        !           289:                CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit',
        !           290:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
        !           291: *
        !           292: *              C := C - V * W'
        !           293: *
        !           294:                IF( LASTV.GT.K ) THEN
        !           295: *
        !           296: *                 C1 := C1 - V1 * W'
        !           297: *
        !           298:                   CALL DGEMM( 'No transpose', 'Transpose',
        !           299:      $                 LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK,
        !           300:      $                 ONE, C, LDC )
        !           301:                END IF
        !           302: *
        !           303: *              W := W * V2'
        !           304: *
        !           305:                CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',
        !           306:      $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
        !           307:      $              WORK, LDWORK )
        !           308: *
        !           309: *              C2 := C2 - W'
        !           310: *
        !           311:                DO 90 J = 1, K
        !           312:                   DO 80 I = 1, LASTC
        !           313:                      C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J)
        !           314:    80             CONTINUE
        !           315:    90          CONTINUE
        !           316: *
        !           317:             ELSE IF( LSAME( SIDE, 'R' ) ) THEN
        !           318: *
        !           319: *              Form  C * H  or  C * H'  where  C = ( C1  C2 )
        !           320: *
        !           321:                LASTV = MAX( K, ILADLR( N, K, V, LDV ) )
        !           322:                LASTC = ILADLR( M, LASTV, C, LDC )
        !           323: *
        !           324: *              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
        !           325: *
        !           326: *              W := C2
        !           327: *
        !           328:                DO 100 J = 1, K
        !           329:                   CALL DCOPY( LASTC, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
        !           330:   100          CONTINUE
        !           331: *
        !           332: *              W := W * V2
        !           333: *
        !           334:                CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
        !           335:      $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
        !           336:      $              WORK, LDWORK )
        !           337:                IF( LASTV.GT.K ) THEN
        !           338: *
        !           339: *                 W := W + C1 * V1
        !           340: *
        !           341:                   CALL DGEMM( 'No transpose', 'No transpose',
        !           342:      $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,
        !           343:      $                 ONE, WORK, LDWORK )
        !           344:                END IF
        !           345: *
        !           346: *              W := W * T  or  W * T'
        !           347: *
        !           348:                CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit',
        !           349:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
        !           350: *
        !           351: *              C := C - W * V'
        !           352: *
        !           353:                IF( LASTV.GT.K ) THEN
        !           354: *
        !           355: *                 C1 := C1 - W * V1'
        !           356: *
        !           357:                   CALL DGEMM( 'No transpose', 'Transpose',
        !           358:      $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,
        !           359:      $                 ONE, C, LDC )
        !           360:                END IF
        !           361: *
        !           362: *              W := W * V2'
        !           363: *
        !           364:                CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',
        !           365:      $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
        !           366:      $              WORK, LDWORK )
        !           367: *
        !           368: *              C2 := C2 - W
        !           369: *
        !           370:                DO 120 J = 1, K
        !           371:                   DO 110 I = 1, LASTC
        !           372:                      C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J)
        !           373:   110             CONTINUE
        !           374:   120          CONTINUE
        !           375:             END IF
        !           376:          END IF
        !           377: *
        !           378:       ELSE IF( LSAME( STOREV, 'R' ) ) THEN
        !           379: *
        !           380:          IF( LSAME( DIRECT, 'F' ) ) THEN
        !           381: *
        !           382: *           Let  V =  ( V1  V2 )    (V1: first K columns)
        !           383: *           where  V1  is unit upper triangular.
        !           384: *
        !           385:             IF( LSAME( SIDE, 'L' ) ) THEN
        !           386: *
        !           387: *              Form  H * C  or  H' * C  where  C = ( C1 )
        !           388: *                                                  ( C2 )
        !           389: *
        !           390:                LASTV = MAX( K, ILADLC( K, M, V, LDV ) )
        !           391:                LASTC = ILADLC( LASTV, N, C, LDC )
        !           392: *
        !           393: *              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
        !           394: *
        !           395: *              W := C1'
        !           396: *
        !           397:                DO 130 J = 1, K
        !           398:                   CALL DCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )
        !           399:   130          CONTINUE
        !           400: *
        !           401: *              W := W * V1'
        !           402: *
        !           403:                CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',
        !           404:      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
        !           405:                IF( LASTV.GT.K ) THEN
        !           406: *
        !           407: *                 W := W + C2'*V2'
        !           408: *
        !           409:                   CALL DGEMM( 'Transpose', 'Transpose',
        !           410:      $                 LASTC, K, LASTV-K,
        !           411:      $                 ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV,
        !           412:      $                 ONE, WORK, LDWORK )
        !           413:                END IF
        !           414: *
        !           415: *              W := W * T'  or  W * T
        !           416: *
        !           417:                CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit',
        !           418:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
        !           419: *
        !           420: *              C := C - V' * W'
        !           421: *
        !           422:                IF( LASTV.GT.K ) THEN
        !           423: *
        !           424: *                 C2 := C2 - V2' * W'
        !           425: *
        !           426:                   CALL DGEMM( 'Transpose', 'Transpose',
        !           427:      $                 LASTV-K, LASTC, K,
        !           428:      $                 -ONE, V( 1, K+1 ), LDV, WORK, LDWORK,
        !           429:      $                 ONE, C( K+1, 1 ), LDC )
        !           430:                END IF
        !           431: *
        !           432: *              W := W * V1
        !           433: *
        !           434:                CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
        !           435:      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
        !           436: *
        !           437: *              C1 := C1 - W'
        !           438: *
        !           439:                DO 150 J = 1, K
        !           440:                   DO 140 I = 1, LASTC
        !           441:                      C( J, I ) = C( J, I ) - WORK( I, J )
        !           442:   140             CONTINUE
        !           443:   150          CONTINUE
        !           444: *
        !           445:             ELSE IF( LSAME( SIDE, 'R' ) ) THEN
        !           446: *
        !           447: *              Form  C * H  or  C * H'  where  C = ( C1  C2 )
        !           448: *
        !           449:                LASTV = MAX( K, ILADLC( K, N, V, LDV ) )
        !           450:                LASTC = ILADLR( M, LASTV, C, LDC )
        !           451: *
        !           452: *              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
        !           453: *
        !           454: *              W := C1
        !           455: *
        !           456:                DO 160 J = 1, K
        !           457:                   CALL DCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )
        !           458:   160          CONTINUE
        !           459: *
        !           460: *              W := W * V1'
        !           461: *
        !           462:                CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',
        !           463:      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
        !           464:                IF( LASTV.GT.K ) THEN
        !           465: *
        !           466: *                 W := W + C2 * V2'
        !           467: *
        !           468:                   CALL DGEMM( 'No transpose', 'Transpose',
        !           469:      $                 LASTC, K, LASTV-K,
        !           470:      $                 ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV,
        !           471:      $                 ONE, WORK, LDWORK )
        !           472:                END IF
        !           473: *
        !           474: *              W := W * T  or  W * T'
        !           475: *
        !           476:                CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit',
        !           477:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
        !           478: *
        !           479: *              C := C - W * V
        !           480: *
        !           481:                IF( LASTV.GT.K ) THEN
        !           482: *
        !           483: *                 C2 := C2 - W * V2
        !           484: *
        !           485:                   CALL DGEMM( 'No transpose', 'No transpose',
        !           486:      $                 LASTC, LASTV-K, K,
        !           487:      $                 -ONE, WORK, LDWORK, V( 1, K+1 ), LDV,
        !           488:      $                 ONE, C( 1, K+1 ), LDC )
        !           489:                END IF
        !           490: *
        !           491: *              W := W * V1
        !           492: *
        !           493:                CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
        !           494:      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
        !           495: *
        !           496: *              C1 := C1 - W
        !           497: *
        !           498:                DO 180 J = 1, K
        !           499:                   DO 170 I = 1, LASTC
        !           500:                      C( I, J ) = C( I, J ) - WORK( I, J )
        !           501:   170             CONTINUE
        !           502:   180          CONTINUE
        !           503: *
        !           504:             END IF
        !           505: *
        !           506:          ELSE
        !           507: *
        !           508: *           Let  V =  ( V1  V2 )    (V2: last K columns)
        !           509: *           where  V2  is unit lower triangular.
        !           510: *
        !           511:             IF( LSAME( SIDE, 'L' ) ) THEN
        !           512: *
        !           513: *              Form  H * C  or  H' * C  where  C = ( C1 )
        !           514: *                                                  ( C2 )
        !           515: *
        !           516:                LASTV = MAX( K, ILADLC( K, M, V, LDV ) )
        !           517:                LASTC = ILADLC( LASTV, N, C, LDC )
        !           518: *
        !           519: *              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
        !           520: *
        !           521: *              W := C2'
        !           522: *
        !           523:                DO 190 J = 1, K
        !           524:                   CALL DCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,
        !           525:      $                 WORK( 1, J ), 1 )
        !           526:   190          CONTINUE
        !           527: *
        !           528: *              W := W * V2'
        !           529: *
        !           530:                CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',
        !           531:      $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
        !           532:      $              WORK, LDWORK )
        !           533:                IF( LASTV.GT.K ) THEN
        !           534: *
        !           535: *                 W := W + C1'*V1'
        !           536: *
        !           537:                   CALL DGEMM( 'Transpose', 'Transpose',
        !           538:      $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,
        !           539:      $                 ONE, WORK, LDWORK )
        !           540:                END IF
        !           541: *
        !           542: *              W := W * T'  or  W * T
        !           543: *
        !           544:                CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit',
        !           545:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
        !           546: *
        !           547: *              C := C - V' * W'
        !           548: *
        !           549:                IF( LASTV.GT.K ) THEN
        !           550: *
        !           551: *                 C1 := C1 - V1' * W'
        !           552: *
        !           553:                   CALL DGEMM( 'Transpose', 'Transpose',
        !           554:      $                 LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK,
        !           555:      $                 ONE, C, LDC )
        !           556:                END IF
        !           557: *
        !           558: *              W := W * V2
        !           559: *
        !           560:                CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
        !           561:      $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
        !           562:      $              WORK, LDWORK )
        !           563: *
        !           564: *              C2 := C2 - W'
        !           565: *
        !           566:                DO 210 J = 1, K
        !           567:                   DO 200 I = 1, LASTC
        !           568:                      C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J)
        !           569:   200             CONTINUE
        !           570:   210          CONTINUE
        !           571: *
        !           572:             ELSE IF( LSAME( SIDE, 'R' ) ) THEN
        !           573: *
        !           574: *              Form  C * H  or  C * H'  where  C = ( C1  C2 )
        !           575: *
        !           576:                LASTV = MAX( K, ILADLC( K, N, V, LDV ) )
        !           577:                LASTC = ILADLR( M, LASTV, C, LDC )
        !           578: *
        !           579: *              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
        !           580: *
        !           581: *              W := C2
        !           582: *
        !           583:                DO 220 J = 1, K
        !           584:                   CALL DCOPY( LASTC, C( 1, LASTV-K+J ), 1,
        !           585:      $                 WORK( 1, J ), 1 )
        !           586:   220          CONTINUE
        !           587: *
        !           588: *              W := W * V2'
        !           589: *
        !           590:                CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',
        !           591:      $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
        !           592:      $              WORK, LDWORK )
        !           593:                IF( LASTV.GT.K ) THEN
        !           594: *
        !           595: *                 W := W + C1 * V1'
        !           596: *
        !           597:                   CALL DGEMM( 'No transpose', 'Transpose',
        !           598:      $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,
        !           599:      $                 ONE, WORK, LDWORK )
        !           600:                END IF
        !           601: *
        !           602: *              W := W * T  or  W * T'
        !           603: *
        !           604:                CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit',
        !           605:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
        !           606: *
        !           607: *              C := C - W * V
        !           608: *
        !           609:                IF( LASTV.GT.K ) THEN
        !           610: *
        !           611: *                 C1 := C1 - W * V1
        !           612: *
        !           613:                   CALL DGEMM( 'No transpose', 'No transpose',
        !           614:      $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,
        !           615:      $                 ONE, C, LDC )
        !           616:                END IF
        !           617: *
        !           618: *              W := W * V2
        !           619: *
        !           620:                CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
        !           621:      $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
        !           622:      $              WORK, LDWORK )
        !           623: *
        !           624: *              C1 := C1 - W
        !           625: *
        !           626:                DO 240 J = 1, K
        !           627:                   DO 230 I = 1, LASTC
        !           628:                      C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J)
        !           629:   230             CONTINUE
        !           630:   240          CONTINUE
        !           631: *
        !           632:             END IF
        !           633: *
        !           634:          END IF
        !           635:       END IF
        !           636: *
        !           637:       RETURN
        !           638: *
        !           639: *     End of DLARFB
        !           640: *
        !           641:       END

CVSweb interface <joel.bertrand@systella.fr>