Annotation of rpl/lapack/lapack/zlarfb.f, revision 1.1
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>