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