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