1 *> \brief \b CLARFB 2 * 3 * =========== DOCUMENTATION =========== 4 * 5 * Online html documentation available at 6 * http://www.netlib.org/lapack/explore-html/ 7 * 8 *> \htmlonly 9 *> Download CLARFB + dependencies 10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarfb.f"> 11 *> [TGZ]</a> 12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarfb.f"> 13 *> [ZIP]</a> 14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarfb.f"> 15 *> [TXT]</a> 16 *> \endhtmlonly 17 * 18 * Definition: 19 * =========== 20 * 21 * SUBROUTINE CLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, 22 * T, LDT, C, LDC, WORK, LDWORK ) 23 * 24 * .. Scalar Arguments .. 25 * CHARACTER DIRECT, SIDE, STOREV, TRANS 26 * INTEGER K, LDC, LDT, LDV, LDWORK, M, N 27 * .. 28 * .. Array Arguments .. 29 * COMPLEX C( LDC, * ), T( LDT, * ), V( LDV, * ), 30 * $ WORK( LDWORK, * ) 31 * .. 32 * 33 * 34 *> \par Purpose: 35 * ============= 36 *> 37 *> \verbatim 38 *> 39 *> CLARFB applies a complex block reflector H or its transpose H**H to a 40 *> complex M-by-N matrix C, from either the left or the right. 41 *> \endverbatim 42 * 43 * Arguments: 44 * ========== 45 * 46 *> \param[in] SIDE 47 *> \verbatim 48 *> SIDE is CHARACTER*1 49 *> = 'L': apply H or H**H from the Left 50 *> = 'R': apply H or H**H from the Right 51 *> \endverbatim 52 *> 53 *> \param[in] TRANS 54 *> \verbatim 55 *> TRANS is CHARACTER*1 56 *> = 'N': apply H (No transpose) 57 *> = 'C': apply H**H (Conjugate transpose) 58 *> \endverbatim 59 *> 60 *> \param[in] DIRECT 61 *> \verbatim 62 *> DIRECT is CHARACTER*1 63 *> Indicates how H is formed from a product of elementary 64 *> reflectors 65 *> = 'F': H = H(1) H(2) . . . H(k) (Forward) 66 *> = 'B': H = H(k) . . . H(2) H(1) (Backward) 67 *> \endverbatim 68 *> 69 *> \param[in] STOREV 70 *> \verbatim 71 *> STOREV is CHARACTER*1 72 *> Indicates how the vectors which define the elementary 73 *> reflectors are stored: 74 *> = 'C': Columnwise 75 *> = 'R': Rowwise 76 *> \endverbatim 77 *> 78 *> \param[in] M 79 *> \verbatim 80 *> M is INTEGER 81 *> The number of rows of the matrix C. 82 *> \endverbatim 83 *> 84 *> \param[in] N 85 *> \verbatim 86 *> N is INTEGER 87 *> The number of columns of the matrix C. 88 *> \endverbatim 89 *> 90 *> \param[in] K 91 *> \verbatim 92 *> K is INTEGER 93 *> The order of the matrix T (= the number of elementary 94 *> reflectors whose product defines the block reflector). 95 *> \endverbatim 96 *> 97 *> \param[in] V 98 *> \verbatim 99 *> V is COMPLEX array, dimension 100 *> (LDV,K) if STOREV = 'C' 101 *> (LDV,M) if STOREV = 'R' and SIDE = 'L' 102 *> (LDV,N) if STOREV = 'R' and SIDE = 'R' 103 *> The matrix V. See Further Details. 104 *> \endverbatim 105 *> 106 *> \param[in] LDV 107 *> \verbatim 108 *> LDV is INTEGER 109 *> The leading dimension of the array V. 110 *> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); 111 *> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); 112 *> if STOREV = 'R', LDV >= K. 113 *> \endverbatim 114 *> 115 *> \param[in] T 116 *> \verbatim 117 *> T is COMPLEX array, dimension (LDT,K) 118 *> The triangular K-by-K matrix T in the representation of the 119 *> block reflector. 120 *> \endverbatim 121 *> 122 *> \param[in] LDT 123 *> \verbatim 124 *> LDT is INTEGER 125 *> The leading dimension of the array T. LDT >= K. 126 *> \endverbatim 127 *> 128 *> \param[in,out] C 129 *> \verbatim 130 *> C is COMPLEX array, dimension (LDC,N) 131 *> On entry, the M-by-N matrix C. 132 *> On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H. 133 *> \endverbatim 134 *> 135 *> \param[in] LDC 136 *> \verbatim 137 *> LDC is INTEGER 138 *> The leading dimension of the array C. LDC >= max(1,M). 139 *> \endverbatim 140 *> 141 *> \param[out] WORK 142 *> \verbatim 143 *> WORK is COMPLEX array, dimension (LDWORK,K) 144 *> \endverbatim 145 *> 146 *> \param[in] LDWORK 147 *> \verbatim 148 *> LDWORK is INTEGER 149 *> The leading dimension of the array WORK. 150 *> If SIDE = 'L', LDWORK >= max(1,N); 151 *> if SIDE = 'R', LDWORK >= max(1,M). 152 *> \endverbatim 153 * 154 * Authors: 155 * ======== 156 * 157 *> \author Univ. of Tennessee 158 *> \author Univ. of California Berkeley 159 *> \author Univ. of Colorado Denver 160 *> \author NAG Ltd. 161 * 162 *> \date November 2011 163 * 164 *> \ingroup complexOTHERauxiliary 165 * 166 *> \par Further Details: 167 * ===================== 168 *> 169 *> \verbatim 170 *> 171 *> The shape of the matrix V and the storage of the vectors which define 172 *> the H(i) is best illustrated by the following example with n = 5 and 173 *> k = 3. The elements equal to 1 are not stored; the corresponding 174 *> array elements are modified but restored on exit. The rest of the 175 *> array is not used. 176 *> 177 *> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': 178 *> 179 *> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) 180 *> ( v1 1 ) ( 1 v2 v2 v2 ) 181 *> ( v1 v2 1 ) ( 1 v3 v3 ) 182 *> ( v1 v2 v3 ) 183 *> ( v1 v2 v3 ) 184 *> 185 *> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': 186 *> 187 *> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) 188 *> ( v1 v2 v3 ) ( v2 v2 v2 1 ) 189 *> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) 190 *> ( 1 v3 ) 191 *> ( 1 ) 192 *> \endverbatim 193 *> 194 * ===================================================================== 195 SUBROUTINE CLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, 196 $ T, LDT, C, LDC, WORK, LDWORK ) 197 * 198 * -- LAPACK auxiliary routine (version 3.4.0) -- 199 * -- LAPACK is a software package provided by Univ. of Tennessee, -- 200 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 201 * November 2011 202 * 203 * .. Scalar Arguments .. 204 CHARACTER DIRECT, SIDE, STOREV, TRANS 205 INTEGER K, LDC, LDT, LDV, LDWORK, M, N 206 * .. 207 * .. Array Arguments .. 208 COMPLEX C( LDC, * ), T( LDT, * ), V( LDV, * ), 209 $ WORK( LDWORK, * ) 210 * .. 211 * 212 * ===================================================================== 213 * 214 * .. Parameters .. 215 COMPLEX ONE 216 PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ) ) 217 * .. 218 * .. Local Scalars .. 219 CHARACTER TRANST 220 INTEGER I, J, LASTV, LASTC 221 * .. 222 * .. External Functions .. 223 LOGICAL LSAME 224 INTEGER ILACLR, ILACLC 225 EXTERNAL LSAME, ILACLR, ILACLC 226 * .. 227 * .. External Subroutines .. 228 EXTERNAL CCOPY, CGEMM, CLACGV, CTRMM 229 * .. 230 * .. Intrinsic Functions .. 231 INTRINSIC CONJG 232 * .. 233 * .. Executable Statements .. 234 * 235 * Quick return if possible 236 * 237 IF( M.LE.0 .OR. N.LE.0 ) 238 $ RETURN 239 * 240 IF( LSAME( TRANS, 'N' ) ) THEN 241 TRANST = 'C' 242 ELSE 243 TRANST = 'N' 244 END IF 245 * 246 IF( LSAME( STOREV, 'C' ) ) THEN 247 * 248 IF( LSAME( DIRECT, 'F' ) ) THEN 249 * 250 * Let V = ( V1 ) (first K rows) 251 * ( V2 ) 252 * where V1 is unit lower triangular. 253 * 254 IF( LSAME( SIDE, 'L' ) ) THEN 255 * 256 * Form H * C or H**H * C where C = ( C1 ) 257 * ( C2 ) 258 * 259 LASTV = MAX( K, ILACLR( M, K, V, LDV ) ) 260 LASTC = ILACLC( LASTV, N, C, LDC ) 261 * 262 * W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) 263 * 264 * W := C1**H 265 * 266 DO 10 J = 1, K 267 CALL CCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) 268 CALL CLACGV( LASTC, WORK( 1, J ), 1 ) 269 10 CONTINUE 270 * 271 * W := W * V1 272 * 273 CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', 274 $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) 275 IF( LASTV.GT.K ) THEN 276 * 277 * W := W + C2**H *V2 278 * 279 CALL CGEMM( 'Conjugate transpose', 'No transpose', 280 $ LASTC, K, LASTV-K, ONE, C( K+1, 1 ), LDC, 281 $ V( K+1, 1 ), LDV, ONE, WORK, LDWORK ) 282 END IF 283 * 284 * W := W * T**H or W * T 285 * 286 CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit', 287 $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 288 * 289 * C := C - V * W**H 290 * 291 IF( M.GT.K ) THEN 292 * 293 * C2 := C2 - V2 * W**H 294 * 295 CALL CGEMM( 'No transpose', 'Conjugate transpose', 296 $ LASTV-K, LASTC, K, -ONE, V( K+1, 1 ), LDV, 297 $ WORK, LDWORK, ONE, C( K+1, 1 ), LDC ) 298 END IF 299 * 300 * W := W * V1**H 301 * 302 CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', 303 $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) 304 * 305 * C1 := C1 - W**H 306 * 307 DO 30 J = 1, K 308 DO 20 I = 1, LASTC 309 C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) ) 310 20 CONTINUE 311 30 CONTINUE 312 * 313 ELSE IF( LSAME( SIDE, 'R' ) ) THEN 314 * 315 * Form C * H or C * H**H where C = ( C1 C2 ) 316 * 317 LASTV = MAX( K, ILACLR( N, K, V, LDV ) ) 318 LASTC = ILACLR( M, LASTV, C, LDC ) 319 * 320 * W := C * V = (C1*V1 + C2*V2) (stored in WORK) 321 * 322 * W := C1 323 * 324 DO 40 J = 1, K 325 CALL CCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) 326 40 CONTINUE 327 * 328 * W := W * V1 329 * 330 CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', 331 $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) 332 IF( LASTV.GT.K ) THEN 333 * 334 * W := W + C2 * V2 335 * 336 CALL CGEMM( 'No transpose', 'No transpose', 337 $ LASTC, K, LASTV-K, 338 $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, 339 $ ONE, WORK, LDWORK ) 340 END IF 341 * 342 * W := W * T or W * T**H 343 * 344 CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit', 345 $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 346 * 347 * C := C - W * V**H 348 * 349 IF( LASTV.GT.K ) THEN 350 * 351 * C2 := C2 - W * V2**H 352 * 353 CALL CGEMM( 'No transpose', 'Conjugate transpose', 354 $ LASTC, LASTV-K, K, 355 $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, 356 $ ONE, C( 1, K+1 ), LDC ) 357 END IF 358 * 359 * W := W * V1**H 360 * 361 CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', 362 $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) 363 * 364 * C1 := C1 - W 365 * 366 DO 60 J = 1, K 367 DO 50 I = 1, LASTC 368 C( I, J ) = C( I, J ) - WORK( I, J ) 369 50 CONTINUE 370 60 CONTINUE 371 END IF 372 * 373 ELSE 374 * 375 * Let V = ( V1 ) 376 * ( V2 ) (last K rows) 377 * where V2 is unit upper triangular. 378 * 379 IF( LSAME( SIDE, 'L' ) ) THEN 380 * 381 * Form H * C or H**H * C where C = ( C1 ) 382 * ( C2 ) 383 * 384 LASTV = MAX( K, ILACLR( M, K, V, LDV ) ) 385 LASTC = ILACLC( LASTV, N, C, LDC ) 386 * 387 * W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) 388 * 389 * W := C2**H 390 * 391 DO 70 J = 1, K 392 CALL CCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, 393 $ WORK( 1, J ), 1 ) 394 CALL CLACGV( LASTC, WORK( 1, J ), 1 ) 395 70 CONTINUE 396 * 397 * W := W * V2 398 * 399 CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', 400 $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, 401 $ WORK, LDWORK ) 402 IF( LASTV.GT.K ) THEN 403 * 404 * W := W + C1**H*V1 405 * 406 CALL CGEMM( 'Conjugate transpose', 'No transpose', 407 $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, 408 $ ONE, WORK, LDWORK ) 409 END IF 410 * 411 * W := W * T**H or W * T 412 * 413 CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit', 414 $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 415 * 416 * C := C - V * W**H 417 * 418 IF( LASTV.GT.K ) THEN 419 * 420 * C1 := C1 - V1 * W**H 421 * 422 CALL CGEMM( 'No transpose', 'Conjugate transpose', 423 $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK, 424 $ ONE, C, LDC ) 425 END IF 426 * 427 * W := W * V2**H 428 * 429 CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', 430 $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, 431 $ WORK, LDWORK ) 432 * 433 * C2 := C2 - W**H 434 * 435 DO 90 J = 1, K 436 DO 80 I = 1, LASTC 437 C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - 438 $ CONJG( WORK( I, J ) ) 439 80 CONTINUE 440 90 CONTINUE 441 * 442 ELSE IF( LSAME( SIDE, 'R' ) ) THEN 443 * 444 * Form C * H or C * H**H where C = ( C1 C2 ) 445 * 446 LASTV = MAX( K, ILACLR( N, K, V, LDV ) ) 447 LASTC = ILACLR( M, LASTV, C, LDC ) 448 * 449 * W := C * V = (C1*V1 + C2*V2) (stored in WORK) 450 * 451 * W := C2 452 * 453 DO 100 J = 1, K 454 CALL CCOPY( LASTC, C( 1, LASTV-K+J ), 1, 455 $ WORK( 1, J ), 1 ) 456 100 CONTINUE 457 * 458 * W := W * V2 459 * 460 CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', 461 $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, 462 $ WORK, LDWORK ) 463 IF( LASTV.GT.K ) THEN 464 * 465 * W := W + C1 * V1 466 * 467 CALL CGEMM( 'No transpose', 'No transpose', 468 $ LASTC, K, LASTV-K, 469 $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) 470 END IF 471 * 472 * W := W * T or W * T**H 473 * 474 CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit', 475 $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 476 * 477 * C := C - W * V**H 478 * 479 IF( LASTV.GT.K ) THEN 480 * 481 * C1 := C1 - W * V1**H 482 * 483 CALL CGEMM( 'No transpose', 'Conjugate transpose', 484 $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, 485 $ ONE, C, LDC ) 486 END IF 487 * 488 * W := W * V2**H 489 * 490 CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', 491 $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, 492 $ WORK, LDWORK ) 493 * 494 * C2 := C2 - W 495 * 496 DO 120 J = 1, K 497 DO 110 I = 1, LASTC 498 C( I, LASTV-K+J ) = C( I, LASTV-K+J ) 499 $ - WORK( I, J ) 500 110 CONTINUE 501 120 CONTINUE 502 END IF 503 END IF 504 * 505 ELSE IF( LSAME( STOREV, 'R' ) ) THEN 506 * 507 IF( LSAME( DIRECT, 'F' ) ) THEN 508 * 509 * Let V = ( V1 V2 ) (V1: first K columns) 510 * where V1 is unit upper triangular. 511 * 512 IF( LSAME( SIDE, 'L' ) ) THEN 513 * 514 * Form H * C or H**H * C where C = ( C1 ) 515 * ( C2 ) 516 * 517 LASTV = MAX( K, ILACLC( K, M, V, LDV ) ) 518 LASTC = ILACLC( LASTV, N, C, LDC ) 519 * 520 * W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) 521 * 522 * W := C1**H 523 * 524 DO 130 J = 1, K 525 CALL CCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) 526 CALL CLACGV( LASTC, WORK( 1, J ), 1 ) 527 130 CONTINUE 528 * 529 * W := W * V1**H 530 * 531 CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', 532 $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) 533 IF( LASTV.GT.K ) THEN 534 * 535 * W := W + C2**H*V2**H 536 * 537 CALL CGEMM( 'Conjugate transpose', 538 $ 'Conjugate transpose', LASTC, K, LASTV-K, 539 $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, 540 $ ONE, WORK, LDWORK ) 541 END IF 542 * 543 * W := W * T**H or W * T 544 * 545 CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit', 546 $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 547 * 548 * C := C - V**H * W**H 549 * 550 IF( LASTV.GT.K ) THEN 551 * 552 * C2 := C2 - V2**H * W**H 553 * 554 CALL CGEMM( 'Conjugate transpose', 555 $ 'Conjugate transpose', LASTV-K, LASTC, K, 556 $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK, 557 $ ONE, C( K+1, 1 ), LDC ) 558 END IF 559 * 560 * W := W * V1 561 * 562 CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', 563 $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) 564 * 565 * C1 := C1 - W**H 566 * 567 DO 150 J = 1, K 568 DO 140 I = 1, LASTC 569 C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) ) 570 140 CONTINUE 571 150 CONTINUE 572 * 573 ELSE IF( LSAME( SIDE, 'R' ) ) THEN 574 * 575 * Form C * H or C * H**H where C = ( C1 C2 ) 576 * 577 LASTV = MAX( K, ILACLC( K, N, V, LDV ) ) 578 LASTC = ILACLR( M, LASTV, C, LDC ) 579 * 580 * W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) 581 * 582 * W := C1 583 * 584 DO 160 J = 1, K 585 CALL CCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) 586 160 CONTINUE 587 * 588 * W := W * V1**H 589 * 590 CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', 591 $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) 592 IF( LASTV.GT.K ) THEN 593 * 594 * W := W + C2 * V2**H 595 * 596 CALL CGEMM( 'No transpose', 'Conjugate transpose', 597 $ LASTC, K, LASTV-K, ONE, C( 1, K+1 ), LDC, 598 $ V( 1, K+1 ), LDV, ONE, WORK, LDWORK ) 599 END IF 600 * 601 * W := W * T or W * T**H 602 * 603 CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit', 604 $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 605 * 606 * C := C - W * V 607 * 608 IF( LASTV.GT.K ) THEN 609 * 610 * C2 := C2 - W * V2 611 * 612 CALL CGEMM( 'No transpose', 'No transpose', 613 $ LASTC, LASTV-K, K, 614 $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, 615 $ ONE, C( 1, K+1 ), LDC ) 616 END IF 617 * 618 * W := W * V1 619 * 620 CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', 621 $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) 622 * 623 * C1 := C1 - W 624 * 625 DO 180 J = 1, K 626 DO 170 I = 1, LASTC 627 C( I, J ) = C( I, J ) - WORK( I, J ) 628 170 CONTINUE 629 180 CONTINUE 630 * 631 END IF 632 * 633 ELSE 634 * 635 * Let V = ( V1 V2 ) (V2: last K columns) 636 * where V2 is unit lower triangular. 637 * 638 IF( LSAME( SIDE, 'L' ) ) THEN 639 * 640 * Form H * C or H**H * C where C = ( C1 ) 641 * ( C2 ) 642 * 643 LASTV = MAX( K, ILACLC( K, M, V, LDV ) ) 644 LASTC = ILACLC( LASTV, N, C, LDC ) 645 * 646 * W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) 647 * 648 * W := C2**H 649 * 650 DO 190 J = 1, K 651 CALL CCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, 652 $ WORK( 1, J ), 1 ) 653 CALL CLACGV( LASTC, WORK( 1, J ), 1 ) 654 190 CONTINUE 655 * 656 * W := W * V2**H 657 * 658 CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', 659 $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, 660 $ WORK, LDWORK ) 661 IF( LASTV.GT.K ) THEN 662 * 663 * W := W + C1**H * V1**H 664 * 665 CALL CGEMM( 'Conjugate transpose', 666 $ 'Conjugate transpose', LASTC, K, LASTV-K, 667 $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) 668 END IF 669 * 670 * W := W * T**H or W * T 671 * 672 CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit', 673 $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 674 * 675 * C := C - V**H * W**H 676 * 677 IF( LASTV.GT.K ) THEN 678 * 679 * C1 := C1 - V1**H * W**H 680 * 681 CALL CGEMM( 'Conjugate transpose', 682 $ 'Conjugate transpose', LASTV-K, LASTC, K, 683 $ -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC ) 684 END IF 685 * 686 * W := W * V2 687 * 688 CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', 689 $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, 690 $ WORK, LDWORK ) 691 * 692 * C2 := C2 - W**H 693 * 694 DO 210 J = 1, K 695 DO 200 I = 1, LASTC 696 C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - 697 $ CONJG( WORK( I, J ) ) 698 200 CONTINUE 699 210 CONTINUE 700 * 701 ELSE IF( LSAME( SIDE, 'R' ) ) THEN 702 * 703 * Form C * H or C * H**H where C = ( C1 C2 ) 704 * 705 LASTV = MAX( K, ILACLC( K, N, V, LDV ) ) 706 LASTC = ILACLR( M, LASTV, C, LDC ) 707 * 708 * W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) 709 * 710 * W := C2 711 * 712 DO 220 J = 1, K 713 CALL CCOPY( LASTC, C( 1, LASTV-K+J ), 1, 714 $ WORK( 1, J ), 1 ) 715 220 CONTINUE 716 * 717 * W := W * V2**H 718 * 719 CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', 720 $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, 721 $ WORK, LDWORK ) 722 IF( LASTV.GT.K ) THEN 723 * 724 * W := W + C1 * V1**H 725 * 726 CALL CGEMM( 'No transpose', 'Conjugate transpose', 727 $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, ONE, 728 $ WORK, LDWORK ) 729 END IF 730 * 731 * W := W * T or W * T**H 732 * 733 CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit', 734 $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 735 * 736 * C := C - W * V 737 * 738 IF( LASTV.GT.K ) THEN 739 * 740 * C1 := C1 - W * V1 741 * 742 CALL CGEMM( 'No transpose', 'No transpose', 743 $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, 744 $ ONE, C, LDC ) 745 END IF 746 * 747 * W := W * V2 748 * 749 CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', 750 $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, 751 $ WORK, LDWORK ) 752 * 753 * C1 := C1 - W 754 * 755 DO 240 J = 1, K 756 DO 230 I = 1, LASTC 757 C( I, LASTV-K+J ) = C( I, LASTV-K+J ) 758 $ - WORK( I, J ) 759 230 CONTINUE 760 240 CONTINUE 761 * 762 END IF 763 * 764 END IF 765 END IF 766 * 767 RETURN 768 * 769 * End of CLARFB 770 * 771 END 772