Annotation of rpl/lapack/lapack/zlarfb.f, revision 1.3

1.1       bertrand    1:       SUBROUTINE ZLARFB( 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:       COMPLEX*16         C( LDC, * ), T( LDT, * ), V( LDV, * ),
                     16:      $                   WORK( LDWORK, * )
                     17: *     ..
                     18: *
                     19: *  Purpose
                     20: *  =======
                     21: *
                     22: *  ZLARFB applies a complex block reflector H or its transpose H' to a
                     23: *  complex 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: *          = 'C': apply H' (Conjugate 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) COMPLEX*16 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) COMPLEX*16 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) COMPLEX*16 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. LDC >= max(1,M).
                     83: *
                     84: *  WORK    (workspace) COMPLEX*16 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:       COMPLEX*16         ONE
                     95:       PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
                     96: *     ..
                     97: *     .. Local Scalars ..
                     98:       CHARACTER          TRANST
                     99:       INTEGER            I, J, LASTV, LASTC
                    100: *     ..
                    101: *     .. External Functions ..
                    102:       LOGICAL            LSAME
                    103:       INTEGER            ILAZLR, ILAZLC
                    104:       EXTERNAL           LSAME, ILAZLR, ILAZLC
                    105: *     ..
                    106: *     .. External Subroutines ..
                    107:       EXTERNAL           ZCOPY, ZGEMM, ZLACGV, ZTRMM
                    108: *     ..
                    109: *     .. Intrinsic Functions ..
                    110:       INTRINSIC          DCONJG
                    111: *     ..
                    112: *     .. Executable Statements ..
                    113: *
                    114: *     Quick return if possible
                    115: *
                    116:       IF( M.LE.0 .OR. N.LE.0 )
                    117:      $   RETURN
                    118: *
                    119:       IF( LSAME( TRANS, 'N' ) ) THEN
                    120:          TRANST = 'C'
                    121:       ELSE
                    122:          TRANST = 'N'
                    123:       END IF
                    124: *
                    125:       IF( LSAME( STOREV, 'C' ) ) THEN
                    126: *
                    127:          IF( LSAME( DIRECT, 'F' ) ) THEN
                    128: *
                    129: *           Let  V =  ( V1 )    (first K rows)
                    130: *                     ( V2 )
                    131: *           where  V1  is unit lower triangular.
                    132: *
                    133:             IF( LSAME( SIDE, 'L' ) ) THEN
                    134: *
                    135: *              Form  H * C  or  H' * C  where  C = ( C1 )
                    136: *                                                  ( C2 )
                    137: *
                    138:                LASTV = MAX( K, ILAZLR( M, K, V, LDV ) )
                    139:                LASTC = ILAZLC( LASTV, N, C, LDC )
                    140: *
                    141: *              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
                    142: *
                    143: *              W := C1'
                    144: *
                    145:                DO 10 J = 1, K
                    146:                   CALL ZCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )
                    147:                   CALL ZLACGV( LASTC, WORK( 1, J ), 1 )
                    148:    10          CONTINUE
                    149: *
                    150: *              W := W * V1
                    151: *
                    152:                CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
                    153:      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
                    154:                IF( LASTV.GT.K ) THEN
                    155: *
                    156: *                 W := W + C2'*V2
                    157: *
                    158:                   CALL ZGEMM( 'Conjugate transpose', 'No transpose',
                    159:      $                 LASTC, K, LASTV-K, ONE, C( K+1, 1 ), LDC,
                    160:      $                 V( K+1, 1 ), LDV, ONE, WORK, LDWORK )
                    161:                END IF
                    162: *
                    163: *              W := W * T'  or  W * T
                    164: *
                    165:                CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit',
                    166:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
                    167: *
                    168: *              C := C - V * W'
                    169: *
                    170:                IF( M.GT.K ) THEN
                    171: *
                    172: *                 C2 := C2 - V2 * W'
                    173: *
                    174:                   CALL ZGEMM( 'No transpose', 'Conjugate transpose',
                    175:      $                 LASTV-K, LASTC, K,
                    176:      $                 -ONE, V( K+1, 1 ), LDV, WORK, LDWORK,
                    177:      $                 ONE, C( K+1, 1 ), LDC )
                    178:                END IF
                    179: *
                    180: *              W := W * V1'
                    181: *
                    182:                CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
                    183:      $              'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )
                    184: *
                    185: *              C1 := C1 - W'
                    186: *
                    187:                DO 30 J = 1, K
                    188:                   DO 20 I = 1, LASTC
                    189:                      C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) )
                    190:    20             CONTINUE
                    191:    30          CONTINUE
                    192: *
                    193:             ELSE IF( LSAME( SIDE, 'R' ) ) THEN
                    194: *
                    195: *              Form  C * H  or  C * H'  where  C = ( C1  C2 )
                    196: *
                    197:                LASTV = MAX( K, ILAZLR( N, K, V, LDV ) )
                    198:                LASTC = ILAZLR( M, LASTV, C, LDC )
                    199: *
                    200: *              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
                    201: *
                    202: *              W := C1
                    203: *
                    204:                DO 40 J = 1, K
                    205:                   CALL ZCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )
                    206:    40          CONTINUE
                    207: *
                    208: *              W := W * V1
                    209: *
                    210:                CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
                    211:      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
                    212:                IF( LASTV.GT.K ) THEN
                    213: *
                    214: *                 W := W + C2 * V2
                    215: *
                    216:                   CALL ZGEMM( 'No transpose', 'No transpose',
                    217:      $                 LASTC, K, LASTV-K,
                    218:      $                 ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
                    219:      $                 ONE, WORK, LDWORK )
                    220:                END IF
                    221: *
                    222: *              W := W * T  or  W * T'
                    223: *
                    224:                CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit',
                    225:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
                    226: *
                    227: *              C := C - W * V'
                    228: *
                    229:                IF( LASTV.GT.K ) THEN
                    230: *
                    231: *                 C2 := C2 - W * V2'
                    232: *
                    233:                   CALL ZGEMM( 'No transpose', 'Conjugate transpose',
                    234:      $                 LASTC, LASTV-K, K,
                    235:      $                 -ONE, WORK, LDWORK, V( K+1, 1 ), LDV,
                    236:      $                 ONE, C( 1, K+1 ), LDC )
                    237:                END IF
                    238: *
                    239: *              W := W * V1'
                    240: *
                    241:                CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
                    242:      $              'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )
                    243: *
                    244: *              C1 := C1 - W
                    245: *
                    246:                DO 60 J = 1, K
                    247:                   DO 50 I = 1, LASTC
                    248:                      C( I, J ) = C( I, J ) - WORK( I, J )
                    249:    50             CONTINUE
                    250:    60          CONTINUE
                    251:             END IF
                    252: *
                    253:          ELSE
                    254: *
                    255: *           Let  V =  ( V1 )
                    256: *                     ( V2 )    (last K rows)
                    257: *           where  V2  is unit upper triangular.
                    258: *
                    259:             IF( LSAME( SIDE, 'L' ) ) THEN
                    260: *
                    261: *              Form  H * C  or  H' * C  where  C = ( C1 )
                    262: *                                                  ( C2 )
                    263: *
                    264:                LASTV = MAX( K, ILAZLR( M, K, V, LDV ) )
                    265:                LASTC = ILAZLC( LASTV, N, C, LDC )
                    266: *
                    267: *              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
                    268: *
                    269: *              W := C2'
                    270: *
                    271:                DO 70 J = 1, K
                    272:                   CALL ZCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,
                    273:      $                 WORK( 1, J ), 1 )
                    274:                   CALL ZLACGV( LASTC, WORK( 1, J ), 1 )
                    275:    70          CONTINUE
                    276: *
                    277: *              W := W * V2
                    278: *
                    279:                CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
                    280:      $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
                    281:      $              WORK, LDWORK )
                    282:                IF( LASTV.GT.K ) THEN
                    283: *
                    284: *                 W := W + C1'*V1
                    285: *
                    286:                   CALL ZGEMM( 'Conjugate transpose', 'No transpose',
                    287:      $                 LASTC, K, LASTV-K,
                    288:      $                 ONE, C, LDC, V, LDV,
                    289:      $                 ONE, WORK, LDWORK )
                    290:                END IF
                    291: *
                    292: *              W := W * T'  or  W * T
                    293: *
                    294:                CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit',
                    295:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
                    296: *
                    297: *              C := C - V * W'
                    298: *
                    299:                IF( LASTV.GT.K ) THEN
                    300: *
                    301: *                 C1 := C1 - V1 * W'
                    302: *
                    303:                   CALL ZGEMM( 'No transpose', 'Conjugate transpose',
                    304:      $                 LASTV-K, LASTC, K,
                    305:      $                 -ONE, V, LDV, WORK, LDWORK,
                    306:      $                 ONE, C, LDC )
                    307:                END IF
                    308: *
                    309: *              W := W * V2'
                    310: *
                    311:                CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
                    312:      $              'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
                    313:      $              WORK, LDWORK )
                    314: *
                    315: *              C2 := C2 - W'
                    316: *
                    317:                DO 90 J = 1, K
                    318:                   DO 80 I = 1, LASTC
                    319:                      C( LASTV-K+J, I ) = C( LASTV-K+J, I ) -
                    320:      $                               DCONJG( WORK( I, J ) )
                    321:    80             CONTINUE
                    322:    90          CONTINUE
                    323: *
                    324:             ELSE IF( LSAME( SIDE, 'R' ) ) THEN
                    325: *
                    326: *              Form  C * H  or  C * H'  where  C = ( C1  C2 )
                    327: *
                    328:                LASTV = MAX( K, ILAZLR( N, K, V, LDV ) )
                    329:                LASTC = ILAZLR( M, LASTV, C, LDC )
                    330: *
                    331: *              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
                    332: *
                    333: *              W := C2
                    334: *
                    335:                DO 100 J = 1, K
                    336:                   CALL ZCOPY( LASTC, C( 1, LASTV-K+J ), 1,
                    337:      $                 WORK( 1, J ), 1 )
                    338:   100          CONTINUE
                    339: *
                    340: *              W := W * V2
                    341: *
                    342:                CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
                    343:      $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
                    344:      $              WORK, LDWORK )
                    345:                IF( LASTV.GT.K ) THEN
                    346: *
                    347: *                 W := W + C1 * V1
                    348: *
                    349:                   CALL ZGEMM( 'No transpose', 'No transpose',
                    350:      $                 LASTC, K, LASTV-K,
                    351:      $                 ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
                    352:                END IF
                    353: *
                    354: *              W := W * T  or  W * T'
                    355: *
                    356:                CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit',
                    357:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
                    358: *
                    359: *              C := C - W * V'
                    360: *
                    361:                IF( LASTV.GT.K ) THEN
                    362: *
                    363: *                 C1 := C1 - W * V1'
                    364: *
                    365:                   CALL ZGEMM( 'No transpose', 'Conjugate transpose',
                    366:      $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,
                    367:      $                 ONE, C, LDC )
                    368:                END IF
                    369: *
                    370: *              W := W * V2'
                    371: *
                    372:                CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
                    373:      $              'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
                    374:      $              WORK, LDWORK )
                    375: *
                    376: *              C2 := C2 - W
                    377: *
                    378:                DO 120 J = 1, K
                    379:                   DO 110 I = 1, LASTC
                    380:                      C( I, LASTV-K+J ) = C( I, LASTV-K+J )
                    381:      $                    - WORK( I, J )
                    382:   110             CONTINUE
                    383:   120          CONTINUE
                    384:             END IF
                    385:          END IF
                    386: *
                    387:       ELSE IF( LSAME( STOREV, 'R' ) ) THEN
                    388: *
                    389:          IF( LSAME( DIRECT, 'F' ) ) THEN
                    390: *
                    391: *           Let  V =  ( V1  V2 )    (V1: first K columns)
                    392: *           where  V1  is unit upper triangular.
                    393: *
                    394:             IF( LSAME( SIDE, 'L' ) ) THEN
                    395: *
                    396: *              Form  H * C  or  H' * C  where  C = ( C1 )
                    397: *                                                  ( C2 )
                    398: *
                    399:                LASTV = MAX( K, ILAZLC( K, M, V, LDV ) )
                    400:                LASTC = ILAZLC( LASTV, N, C, LDC )
                    401: *
                    402: *              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
                    403: *
                    404: *              W := C1'
                    405: *
                    406:                DO 130 J = 1, K
                    407:                   CALL ZCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )
                    408:                   CALL ZLACGV( LASTC, WORK( 1, J ), 1 )
                    409:   130          CONTINUE
                    410: *
                    411: *              W := W * V1'
                    412: *
                    413:                CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
                    414:      $                     'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )
                    415:                IF( LASTV.GT.K ) THEN
                    416: *
                    417: *                 W := W + C2'*V2'
                    418: *
                    419:                   CALL ZGEMM( 'Conjugate transpose',
                    420:      $                 'Conjugate transpose', LASTC, K, LASTV-K,
                    421:      $                 ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV,
                    422:      $                 ONE, WORK, LDWORK )
                    423:                END IF
                    424: *
                    425: *              W := W * T'  or  W * T
                    426: *
                    427:                CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit',
                    428:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
                    429: *
                    430: *              C := C - V' * W'
                    431: *
                    432:                IF( LASTV.GT.K ) THEN
                    433: *
                    434: *                 C2 := C2 - V2' * W'
                    435: *
                    436:                   CALL ZGEMM( 'Conjugate transpose',
                    437:      $                 'Conjugate transpose', LASTV-K, LASTC, K,
                    438:      $                 -ONE, V( 1, K+1 ), LDV, WORK, LDWORK,
                    439:      $                 ONE, C( K+1, 1 ), LDC )
                    440:                END IF
                    441: *
                    442: *              W := W * V1
                    443: *
                    444:                CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
                    445:      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
                    446: *
                    447: *              C1 := C1 - W'
                    448: *
                    449:                DO 150 J = 1, K
                    450:                   DO 140 I = 1, LASTC
                    451:                      C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) )
                    452:   140             CONTINUE
                    453:   150          CONTINUE
                    454: *
                    455:             ELSE IF( LSAME( SIDE, 'R' ) ) THEN
                    456: *
                    457: *              Form  C * H  or  C * H'  where  C = ( C1  C2 )
                    458: *
                    459:                LASTV = MAX( K, ILAZLC( K, N, V, LDV ) )
                    460:                LASTC = ILAZLR( M, LASTV, C, LDC )
                    461: *
                    462: *              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
                    463: *
                    464: *              W := C1
                    465: *
                    466:                DO 160 J = 1, K
                    467:                   CALL ZCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )
                    468:   160          CONTINUE
                    469: *
                    470: *              W := W * V1'
                    471: *
                    472:                CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose',
                    473:      $                     'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK )
                    474:                IF( LASTV.GT.K ) THEN
                    475: *
                    476: *                 W := W + C2 * V2'
                    477: *
                    478:                   CALL ZGEMM( 'No transpose', 'Conjugate transpose',
                    479:      $                 LASTC, K, LASTV-K, ONE, C( 1, K+1 ), LDC,
                    480:      $                 V( 1, K+1 ), LDV, ONE, WORK, LDWORK )
                    481:                END IF
                    482: *
                    483: *              W := W * T  or  W * T'
                    484: *
                    485:                CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit',
                    486:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
                    487: *
                    488: *              C := C - W * V
                    489: *
                    490:                IF( LASTV.GT.K ) THEN
                    491: *
                    492: *                 C2 := C2 - W * V2
                    493: *
                    494:                   CALL ZGEMM( 'No transpose', 'No transpose',
                    495:      $                 LASTC, LASTV-K, K,
                    496:      $                 -ONE, WORK, LDWORK, V( 1, K+1 ), LDV,
                    497:      $                 ONE, C( 1, K+1 ), LDC )
                    498:                END IF
                    499: *
                    500: *              W := W * V1
                    501: *
                    502:                CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
                    503:      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
                    504: *
                    505: *              C1 := C1 - W
                    506: *
                    507:                DO 180 J = 1, K
                    508:                   DO 170 I = 1, LASTC
                    509:                      C( I, J ) = C( I, J ) - WORK( I, J )
                    510:   170             CONTINUE
                    511:   180          CONTINUE
                    512: *
                    513:             END IF
                    514: *
                    515:          ELSE
                    516: *
                    517: *           Let  V =  ( V1  V2 )    (V2: last K columns)
                    518: *           where  V2  is unit lower triangular.
                    519: *
                    520:             IF( LSAME( SIDE, 'L' ) ) THEN
                    521: *
                    522: *              Form  H * C  or  H' * C  where  C = ( C1 )
                    523: *                                                  ( C2 )
                    524: *
                    525:                LASTV = MAX( K, ILAZLC( K, M, V, LDV ) )
                    526:                LASTC = ILAZLC( LASTV, N, C, LDC )
                    527: *
                    528: *              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
                    529: *
                    530: *              W := C2'
                    531: *
                    532:                DO 190 J = 1, K
                    533:                   CALL ZCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,
                    534:      $                 WORK( 1, J ), 1 )
                    535:                   CALL ZLACGV( LASTC, WORK( 1, J ), 1 )
                    536:   190          CONTINUE
                    537: *
                    538: *              W := W * V2'
                    539: *
                    540:                CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
                    541:      $              'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
                    542:      $              WORK, LDWORK )
                    543:                IF( LASTV.GT.K ) THEN
                    544: *
                    545: *                 W := W + C1'*V1'
                    546: *
                    547:                   CALL ZGEMM( 'Conjugate transpose',
                    548:      $                 'Conjugate transpose', LASTC, K, LASTV-K,
                    549:      $                 ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
                    550:                END IF
                    551: *
                    552: *              W := W * T'  or  W * T
                    553: *
                    554:                CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit',
                    555:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
                    556: *
                    557: *              C := C - V' * W'
                    558: *
                    559:                IF( LASTV.GT.K ) THEN
                    560: *
                    561: *                 C1 := C1 - V1' * W'
                    562: *
                    563:                   CALL ZGEMM( 'Conjugate transpose',
                    564:      $                 'Conjugate transpose', LASTV-K, LASTC, K,
                    565:      $                 -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC )
                    566:                END IF
                    567: *
                    568: *              W := W * V2
                    569: *
                    570:                CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
                    571:      $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
                    572:      $              WORK, LDWORK )
                    573: *
                    574: *              C2 := C2 - W'
                    575: *
                    576:                DO 210 J = 1, K
                    577:                   DO 200 I = 1, LASTC
                    578:                      C( LASTV-K+J, I ) = C( LASTV-K+J, I ) -
                    579:      $                               DCONJG( WORK( I, J ) )
                    580:   200             CONTINUE
                    581:   210          CONTINUE
                    582: *
                    583:             ELSE IF( LSAME( SIDE, 'R' ) ) THEN
                    584: *
                    585: *              Form  C * H  or  C * H'  where  C = ( C1  C2 )
                    586: *
                    587:                LASTV = MAX( K, ILAZLC( K, N, V, LDV ) )
                    588:                LASTC = ILAZLR( M, LASTV, C, LDC )
                    589: *
                    590: *              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
                    591: *
                    592: *              W := C2
                    593: *
                    594:                DO 220 J = 1, K
                    595:                   CALL ZCOPY( LASTC, C( 1, LASTV-K+J ), 1,
                    596:      $                 WORK( 1, J ), 1 )
                    597:   220          CONTINUE
                    598: *
                    599: *              W := W * V2'
                    600: *
                    601:                CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose',
                    602:      $              'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
                    603:      $              WORK, LDWORK )
                    604:                IF( LASTV.GT.K ) THEN
                    605: *
                    606: *                 W := W + C1 * V1'
                    607: *
                    608:                   CALL ZGEMM( 'No transpose', 'Conjugate transpose',
                    609:      $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, ONE,
                    610:      $                 WORK, LDWORK )
                    611:                END IF
                    612: *
                    613: *              W := W * T  or  W * T'
                    614: *
                    615:                CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit',
                    616:      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
                    617: *
                    618: *              C := C - W * V
                    619: *
                    620:                IF( LASTV.GT.K ) THEN
                    621: *
                    622: *                 C1 := C1 - W * V1
                    623: *
                    624:                   CALL ZGEMM( 'No transpose', 'No transpose',
                    625:      $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,
                    626:      $                 ONE, C, LDC )
                    627:                END IF
                    628: *
                    629: *              W := W * V2
                    630: *
                    631:                CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
                    632:      $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
                    633:      $              WORK, LDWORK )
                    634: *
                    635: *              C1 := C1 - W
                    636: *
                    637:                DO 240 J = 1, K
                    638:                   DO 230 I = 1, LASTC
                    639:                      C( I, LASTV-K+J ) = C( I, LASTV-K+J )
                    640:      $                    - WORK( I, J )
                    641:   230             CONTINUE
                    642:   240          CONTINUE
                    643: *
                    644:             END IF
                    645: *
                    646:          END IF
                    647:       END IF
                    648: *
                    649:       RETURN
                    650: *
                    651: *     End of ZLARFB
                    652: *
                    653:       END

CVSweb interface <joel.bertrand@systella.fr>