1*bf2c3715SXin Li*> \brief \b CLARFB 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 CLARFB + dependencies 10*bf2c3715SXin Li*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarfb.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/clarfb.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/clarfb.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 CLARFB( 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* COMPLEX 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*> CLARFB applies a complex block reflector H or its transpose H**H to a 40*bf2c3715SXin Li*> complex 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**H from the Left 50*bf2c3715SXin Li*> = 'R': apply H or H**H 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*> = 'C': apply H**H (Conjugate 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 COMPLEX 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 COMPLEX 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 COMPLEX 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**H*C or C*H or C*H**H. 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 COMPLEX 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 complexOTHERauxiliary 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 CLARFB( 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 COMPLEX 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 COMPLEX ONE 216*bf2c3715SXin Li PARAMETER ( ONE = ( 1.0E+0, 0.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 ILACLR, ILACLC 225*bf2c3715SXin Li EXTERNAL LSAME, ILACLR, ILACLC 226*bf2c3715SXin Li* .. 227*bf2c3715SXin Li* .. External Subroutines .. 228*bf2c3715SXin Li EXTERNAL CCOPY, CGEMM, CLACGV, CTRMM 229*bf2c3715SXin Li* .. 230*bf2c3715SXin Li* .. Intrinsic Functions .. 231*bf2c3715SXin Li INTRINSIC CONJG 232*bf2c3715SXin Li* .. 233*bf2c3715SXin Li* .. Executable Statements .. 234*bf2c3715SXin Li* 235*bf2c3715SXin Li* Quick return if possible 236*bf2c3715SXin Li* 237*bf2c3715SXin Li IF( M.LE.0 .OR. N.LE.0 ) 238*bf2c3715SXin Li $ RETURN 239*bf2c3715SXin Li* 240*bf2c3715SXin Li IF( LSAME( TRANS, 'N' ) ) THEN 241*bf2c3715SXin Li TRANST = 'C' 242*bf2c3715SXin Li ELSE 243*bf2c3715SXin Li TRANST = 'N' 244*bf2c3715SXin Li END IF 245*bf2c3715SXin Li* 246*bf2c3715SXin Li IF( LSAME( STOREV, 'C' ) ) THEN 247*bf2c3715SXin Li* 248*bf2c3715SXin Li IF( LSAME( DIRECT, 'F' ) ) THEN 249*bf2c3715SXin Li* 250*bf2c3715SXin Li* Let V = ( V1 ) (first K rows) 251*bf2c3715SXin Li* ( V2 ) 252*bf2c3715SXin Li* where V1 is unit lower triangular. 253*bf2c3715SXin Li* 254*bf2c3715SXin Li IF( LSAME( SIDE, 'L' ) ) THEN 255*bf2c3715SXin Li* 256*bf2c3715SXin Li* Form H * C or H**H * C where C = ( C1 ) 257*bf2c3715SXin Li* ( C2 ) 258*bf2c3715SXin Li* 259*bf2c3715SXin Li LASTV = MAX( K, ILACLR( M, K, V, LDV ) ) 260*bf2c3715SXin Li LASTC = ILACLC( LASTV, N, C, LDC ) 261*bf2c3715SXin Li* 262*bf2c3715SXin Li* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) 263*bf2c3715SXin Li* 264*bf2c3715SXin Li* W := C1**H 265*bf2c3715SXin Li* 266*bf2c3715SXin Li DO 10 J = 1, K 267*bf2c3715SXin Li CALL CCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) 268*bf2c3715SXin Li CALL CLACGV( LASTC, WORK( 1, J ), 1 ) 269*bf2c3715SXin Li 10 CONTINUE 270*bf2c3715SXin Li* 271*bf2c3715SXin Li* W := W * V1 272*bf2c3715SXin Li* 273*bf2c3715SXin Li CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', 274*bf2c3715SXin Li $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) 275*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 276*bf2c3715SXin Li* 277*bf2c3715SXin Li* W := W + C2**H *V2 278*bf2c3715SXin Li* 279*bf2c3715SXin Li CALL CGEMM( 'Conjugate transpose', 'No transpose', 280*bf2c3715SXin Li $ LASTC, K, LASTV-K, ONE, C( K+1, 1 ), LDC, 281*bf2c3715SXin Li $ V( K+1, 1 ), LDV, ONE, WORK, LDWORK ) 282*bf2c3715SXin Li END IF 283*bf2c3715SXin Li* 284*bf2c3715SXin Li* W := W * T**H or W * T 285*bf2c3715SXin Li* 286*bf2c3715SXin Li CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit', 287*bf2c3715SXin Li $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 288*bf2c3715SXin Li* 289*bf2c3715SXin Li* C := C - V * W**H 290*bf2c3715SXin Li* 291*bf2c3715SXin Li IF( M.GT.K ) THEN 292*bf2c3715SXin Li* 293*bf2c3715SXin Li* C2 := C2 - V2 * W**H 294*bf2c3715SXin Li* 295*bf2c3715SXin Li CALL CGEMM( 'No transpose', 'Conjugate transpose', 296*bf2c3715SXin Li $ LASTV-K, LASTC, K, -ONE, V( K+1, 1 ), LDV, 297*bf2c3715SXin Li $ WORK, LDWORK, ONE, C( K+1, 1 ), LDC ) 298*bf2c3715SXin Li END IF 299*bf2c3715SXin Li* 300*bf2c3715SXin Li* W := W * V1**H 301*bf2c3715SXin Li* 302*bf2c3715SXin Li CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', 303*bf2c3715SXin Li $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) 304*bf2c3715SXin Li* 305*bf2c3715SXin Li* C1 := C1 - W**H 306*bf2c3715SXin Li* 307*bf2c3715SXin Li DO 30 J = 1, K 308*bf2c3715SXin Li DO 20 I = 1, LASTC 309*bf2c3715SXin Li C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) ) 310*bf2c3715SXin Li 20 CONTINUE 311*bf2c3715SXin Li 30 CONTINUE 312*bf2c3715SXin Li* 313*bf2c3715SXin Li ELSE IF( LSAME( SIDE, 'R' ) ) THEN 314*bf2c3715SXin Li* 315*bf2c3715SXin Li* Form C * H or C * H**H where C = ( C1 C2 ) 316*bf2c3715SXin Li* 317*bf2c3715SXin Li LASTV = MAX( K, ILACLR( N, K, V, LDV ) ) 318*bf2c3715SXin Li LASTC = ILACLR( M, LASTV, C, LDC ) 319*bf2c3715SXin Li* 320*bf2c3715SXin Li* W := C * V = (C1*V1 + C2*V2) (stored in WORK) 321*bf2c3715SXin Li* 322*bf2c3715SXin Li* W := C1 323*bf2c3715SXin Li* 324*bf2c3715SXin Li DO 40 J = 1, K 325*bf2c3715SXin Li CALL CCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) 326*bf2c3715SXin Li 40 CONTINUE 327*bf2c3715SXin Li* 328*bf2c3715SXin Li* W := W * V1 329*bf2c3715SXin Li* 330*bf2c3715SXin Li CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', 331*bf2c3715SXin Li $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) 332*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 333*bf2c3715SXin Li* 334*bf2c3715SXin Li* W := W + C2 * V2 335*bf2c3715SXin Li* 336*bf2c3715SXin Li CALL CGEMM( 'No transpose', 'No transpose', 337*bf2c3715SXin Li $ LASTC, K, LASTV-K, 338*bf2c3715SXin Li $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, 339*bf2c3715SXin Li $ ONE, WORK, LDWORK ) 340*bf2c3715SXin Li END IF 341*bf2c3715SXin Li* 342*bf2c3715SXin Li* W := W * T or W * T**H 343*bf2c3715SXin Li* 344*bf2c3715SXin Li CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit', 345*bf2c3715SXin Li $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 346*bf2c3715SXin Li* 347*bf2c3715SXin Li* C := C - W * V**H 348*bf2c3715SXin Li* 349*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 350*bf2c3715SXin Li* 351*bf2c3715SXin Li* C2 := C2 - W * V2**H 352*bf2c3715SXin Li* 353*bf2c3715SXin Li CALL CGEMM( 'No transpose', 'Conjugate transpose', 354*bf2c3715SXin Li $ LASTC, LASTV-K, K, 355*bf2c3715SXin Li $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, 356*bf2c3715SXin Li $ ONE, C( 1, K+1 ), LDC ) 357*bf2c3715SXin Li END IF 358*bf2c3715SXin Li* 359*bf2c3715SXin Li* W := W * V1**H 360*bf2c3715SXin Li* 361*bf2c3715SXin Li CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', 362*bf2c3715SXin Li $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) 363*bf2c3715SXin Li* 364*bf2c3715SXin Li* C1 := C1 - W 365*bf2c3715SXin Li* 366*bf2c3715SXin Li DO 60 J = 1, K 367*bf2c3715SXin Li DO 50 I = 1, LASTC 368*bf2c3715SXin Li C( I, J ) = C( I, J ) - WORK( I, J ) 369*bf2c3715SXin Li 50 CONTINUE 370*bf2c3715SXin Li 60 CONTINUE 371*bf2c3715SXin Li END IF 372*bf2c3715SXin Li* 373*bf2c3715SXin Li ELSE 374*bf2c3715SXin Li* 375*bf2c3715SXin Li* Let V = ( V1 ) 376*bf2c3715SXin Li* ( V2 ) (last K rows) 377*bf2c3715SXin Li* where V2 is unit upper triangular. 378*bf2c3715SXin Li* 379*bf2c3715SXin Li IF( LSAME( SIDE, 'L' ) ) THEN 380*bf2c3715SXin Li* 381*bf2c3715SXin Li* Form H * C or H**H * C where C = ( C1 ) 382*bf2c3715SXin Li* ( C2 ) 383*bf2c3715SXin Li* 384*bf2c3715SXin Li LASTV = MAX( K, ILACLR( M, K, V, LDV ) ) 385*bf2c3715SXin Li LASTC = ILACLC( LASTV, N, C, LDC ) 386*bf2c3715SXin Li* 387*bf2c3715SXin Li* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) 388*bf2c3715SXin Li* 389*bf2c3715SXin Li* W := C2**H 390*bf2c3715SXin Li* 391*bf2c3715SXin Li DO 70 J = 1, K 392*bf2c3715SXin Li CALL CCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, 393*bf2c3715SXin Li $ WORK( 1, J ), 1 ) 394*bf2c3715SXin Li CALL CLACGV( LASTC, WORK( 1, J ), 1 ) 395*bf2c3715SXin Li 70 CONTINUE 396*bf2c3715SXin Li* 397*bf2c3715SXin Li* W := W * V2 398*bf2c3715SXin Li* 399*bf2c3715SXin Li CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', 400*bf2c3715SXin Li $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, 401*bf2c3715SXin Li $ WORK, LDWORK ) 402*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 403*bf2c3715SXin Li* 404*bf2c3715SXin Li* W := W + C1**H*V1 405*bf2c3715SXin Li* 406*bf2c3715SXin Li CALL CGEMM( 'Conjugate transpose', 'No transpose', 407*bf2c3715SXin Li $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, 408*bf2c3715SXin Li $ ONE, WORK, LDWORK ) 409*bf2c3715SXin Li END IF 410*bf2c3715SXin Li* 411*bf2c3715SXin Li* W := W * T**H or W * T 412*bf2c3715SXin Li* 413*bf2c3715SXin Li CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit', 414*bf2c3715SXin Li $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 415*bf2c3715SXin Li* 416*bf2c3715SXin Li* C := C - V * W**H 417*bf2c3715SXin Li* 418*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 419*bf2c3715SXin Li* 420*bf2c3715SXin Li* C1 := C1 - V1 * W**H 421*bf2c3715SXin Li* 422*bf2c3715SXin Li CALL CGEMM( 'No transpose', 'Conjugate transpose', 423*bf2c3715SXin Li $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK, 424*bf2c3715SXin Li $ ONE, C, LDC ) 425*bf2c3715SXin Li END IF 426*bf2c3715SXin Li* 427*bf2c3715SXin Li* W := W * V2**H 428*bf2c3715SXin Li* 429*bf2c3715SXin Li CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', 430*bf2c3715SXin Li $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, 431*bf2c3715SXin Li $ WORK, LDWORK ) 432*bf2c3715SXin Li* 433*bf2c3715SXin Li* C2 := C2 - W**H 434*bf2c3715SXin Li* 435*bf2c3715SXin Li DO 90 J = 1, K 436*bf2c3715SXin Li DO 80 I = 1, LASTC 437*bf2c3715SXin Li C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - 438*bf2c3715SXin Li $ CONJG( WORK( I, J ) ) 439*bf2c3715SXin Li 80 CONTINUE 440*bf2c3715SXin Li 90 CONTINUE 441*bf2c3715SXin Li* 442*bf2c3715SXin Li ELSE IF( LSAME( SIDE, 'R' ) ) THEN 443*bf2c3715SXin Li* 444*bf2c3715SXin Li* Form C * H or C * H**H where C = ( C1 C2 ) 445*bf2c3715SXin Li* 446*bf2c3715SXin Li LASTV = MAX( K, ILACLR( N, K, V, LDV ) ) 447*bf2c3715SXin Li LASTC = ILACLR( M, LASTV, C, LDC ) 448*bf2c3715SXin Li* 449*bf2c3715SXin Li* W := C * V = (C1*V1 + C2*V2) (stored in WORK) 450*bf2c3715SXin Li* 451*bf2c3715SXin Li* W := C2 452*bf2c3715SXin Li* 453*bf2c3715SXin Li DO 100 J = 1, K 454*bf2c3715SXin Li CALL CCOPY( LASTC, C( 1, LASTV-K+J ), 1, 455*bf2c3715SXin Li $ WORK( 1, J ), 1 ) 456*bf2c3715SXin Li 100 CONTINUE 457*bf2c3715SXin Li* 458*bf2c3715SXin Li* W := W * V2 459*bf2c3715SXin Li* 460*bf2c3715SXin Li CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', 461*bf2c3715SXin Li $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, 462*bf2c3715SXin Li $ WORK, LDWORK ) 463*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 464*bf2c3715SXin Li* 465*bf2c3715SXin Li* W := W + C1 * V1 466*bf2c3715SXin Li* 467*bf2c3715SXin Li CALL CGEMM( 'No transpose', 'No transpose', 468*bf2c3715SXin Li $ LASTC, K, LASTV-K, 469*bf2c3715SXin Li $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) 470*bf2c3715SXin Li END IF 471*bf2c3715SXin Li* 472*bf2c3715SXin Li* W := W * T or W * T**H 473*bf2c3715SXin Li* 474*bf2c3715SXin Li CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit', 475*bf2c3715SXin Li $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 476*bf2c3715SXin Li* 477*bf2c3715SXin Li* C := C - W * V**H 478*bf2c3715SXin Li* 479*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 480*bf2c3715SXin Li* 481*bf2c3715SXin Li* C1 := C1 - W * V1**H 482*bf2c3715SXin Li* 483*bf2c3715SXin Li CALL CGEMM( 'No transpose', 'Conjugate transpose', 484*bf2c3715SXin Li $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, 485*bf2c3715SXin Li $ ONE, C, LDC ) 486*bf2c3715SXin Li END IF 487*bf2c3715SXin Li* 488*bf2c3715SXin Li* W := W * V2**H 489*bf2c3715SXin Li* 490*bf2c3715SXin Li CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', 491*bf2c3715SXin Li $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, 492*bf2c3715SXin Li $ WORK, LDWORK ) 493*bf2c3715SXin Li* 494*bf2c3715SXin Li* C2 := C2 - W 495*bf2c3715SXin Li* 496*bf2c3715SXin Li DO 120 J = 1, K 497*bf2c3715SXin Li DO 110 I = 1, LASTC 498*bf2c3715SXin Li C( I, LASTV-K+J ) = C( I, LASTV-K+J ) 499*bf2c3715SXin Li $ - WORK( I, J ) 500*bf2c3715SXin Li 110 CONTINUE 501*bf2c3715SXin Li 120 CONTINUE 502*bf2c3715SXin Li END IF 503*bf2c3715SXin Li END IF 504*bf2c3715SXin Li* 505*bf2c3715SXin Li ELSE IF( LSAME( STOREV, 'R' ) ) THEN 506*bf2c3715SXin Li* 507*bf2c3715SXin Li IF( LSAME( DIRECT, 'F' ) ) THEN 508*bf2c3715SXin Li* 509*bf2c3715SXin Li* Let V = ( V1 V2 ) (V1: first K columns) 510*bf2c3715SXin Li* where V1 is unit upper triangular. 511*bf2c3715SXin Li* 512*bf2c3715SXin Li IF( LSAME( SIDE, 'L' ) ) THEN 513*bf2c3715SXin Li* 514*bf2c3715SXin Li* Form H * C or H**H * C where C = ( C1 ) 515*bf2c3715SXin Li* ( C2 ) 516*bf2c3715SXin Li* 517*bf2c3715SXin Li LASTV = MAX( K, ILACLC( K, M, V, LDV ) ) 518*bf2c3715SXin Li LASTC = ILACLC( LASTV, N, C, LDC ) 519*bf2c3715SXin Li* 520*bf2c3715SXin Li* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) 521*bf2c3715SXin Li* 522*bf2c3715SXin Li* W := C1**H 523*bf2c3715SXin Li* 524*bf2c3715SXin Li DO 130 J = 1, K 525*bf2c3715SXin Li CALL CCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) 526*bf2c3715SXin Li CALL CLACGV( LASTC, WORK( 1, J ), 1 ) 527*bf2c3715SXin Li 130 CONTINUE 528*bf2c3715SXin Li* 529*bf2c3715SXin Li* W := W * V1**H 530*bf2c3715SXin Li* 531*bf2c3715SXin Li CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', 532*bf2c3715SXin Li $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) 533*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 534*bf2c3715SXin Li* 535*bf2c3715SXin Li* W := W + C2**H*V2**H 536*bf2c3715SXin Li* 537*bf2c3715SXin Li CALL CGEMM( 'Conjugate transpose', 538*bf2c3715SXin Li $ 'Conjugate transpose', LASTC, K, LASTV-K, 539*bf2c3715SXin Li $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, 540*bf2c3715SXin Li $ ONE, WORK, LDWORK ) 541*bf2c3715SXin Li END IF 542*bf2c3715SXin Li* 543*bf2c3715SXin Li* W := W * T**H or W * T 544*bf2c3715SXin Li* 545*bf2c3715SXin Li CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit', 546*bf2c3715SXin Li $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 547*bf2c3715SXin Li* 548*bf2c3715SXin Li* C := C - V**H * W**H 549*bf2c3715SXin Li* 550*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 551*bf2c3715SXin Li* 552*bf2c3715SXin Li* C2 := C2 - V2**H * W**H 553*bf2c3715SXin Li* 554*bf2c3715SXin Li CALL CGEMM( 'Conjugate transpose', 555*bf2c3715SXin Li $ 'Conjugate transpose', LASTV-K, LASTC, K, 556*bf2c3715SXin Li $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK, 557*bf2c3715SXin Li $ ONE, C( K+1, 1 ), LDC ) 558*bf2c3715SXin Li END IF 559*bf2c3715SXin Li* 560*bf2c3715SXin Li* W := W * V1 561*bf2c3715SXin Li* 562*bf2c3715SXin Li CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', 563*bf2c3715SXin Li $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) 564*bf2c3715SXin Li* 565*bf2c3715SXin Li* C1 := C1 - W**H 566*bf2c3715SXin Li* 567*bf2c3715SXin Li DO 150 J = 1, K 568*bf2c3715SXin Li DO 140 I = 1, LASTC 569*bf2c3715SXin Li C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) ) 570*bf2c3715SXin Li 140 CONTINUE 571*bf2c3715SXin Li 150 CONTINUE 572*bf2c3715SXin Li* 573*bf2c3715SXin Li ELSE IF( LSAME( SIDE, 'R' ) ) THEN 574*bf2c3715SXin Li* 575*bf2c3715SXin Li* Form C * H or C * H**H where C = ( C1 C2 ) 576*bf2c3715SXin Li* 577*bf2c3715SXin Li LASTV = MAX( K, ILACLC( K, N, V, LDV ) ) 578*bf2c3715SXin Li LASTC = ILACLR( M, LASTV, C, LDC ) 579*bf2c3715SXin Li* 580*bf2c3715SXin Li* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) 581*bf2c3715SXin Li* 582*bf2c3715SXin Li* W := C1 583*bf2c3715SXin Li* 584*bf2c3715SXin Li DO 160 J = 1, K 585*bf2c3715SXin Li CALL CCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) 586*bf2c3715SXin Li 160 CONTINUE 587*bf2c3715SXin Li* 588*bf2c3715SXin Li* W := W * V1**H 589*bf2c3715SXin Li* 590*bf2c3715SXin Li CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', 591*bf2c3715SXin Li $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) 592*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 593*bf2c3715SXin Li* 594*bf2c3715SXin Li* W := W + C2 * V2**H 595*bf2c3715SXin Li* 596*bf2c3715SXin Li CALL CGEMM( 'No transpose', 'Conjugate transpose', 597*bf2c3715SXin Li $ LASTC, K, LASTV-K, ONE, C( 1, K+1 ), LDC, 598*bf2c3715SXin Li $ V( 1, K+1 ), LDV, ONE, WORK, LDWORK ) 599*bf2c3715SXin Li END IF 600*bf2c3715SXin Li* 601*bf2c3715SXin Li* W := W * T or W * T**H 602*bf2c3715SXin Li* 603*bf2c3715SXin Li CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit', 604*bf2c3715SXin Li $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 605*bf2c3715SXin Li* 606*bf2c3715SXin Li* C := C - W * V 607*bf2c3715SXin Li* 608*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 609*bf2c3715SXin Li* 610*bf2c3715SXin Li* C2 := C2 - W * V2 611*bf2c3715SXin Li* 612*bf2c3715SXin Li CALL CGEMM( 'No transpose', 'No transpose', 613*bf2c3715SXin Li $ LASTC, LASTV-K, K, 614*bf2c3715SXin Li $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, 615*bf2c3715SXin Li $ ONE, C( 1, K+1 ), LDC ) 616*bf2c3715SXin Li END IF 617*bf2c3715SXin Li* 618*bf2c3715SXin Li* W := W * V1 619*bf2c3715SXin Li* 620*bf2c3715SXin Li CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', 621*bf2c3715SXin Li $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) 622*bf2c3715SXin Li* 623*bf2c3715SXin Li* C1 := C1 - W 624*bf2c3715SXin Li* 625*bf2c3715SXin Li DO 180 J = 1, K 626*bf2c3715SXin Li DO 170 I = 1, LASTC 627*bf2c3715SXin Li C( I, J ) = C( I, J ) - WORK( I, J ) 628*bf2c3715SXin Li 170 CONTINUE 629*bf2c3715SXin Li 180 CONTINUE 630*bf2c3715SXin Li* 631*bf2c3715SXin Li END IF 632*bf2c3715SXin Li* 633*bf2c3715SXin Li ELSE 634*bf2c3715SXin Li* 635*bf2c3715SXin Li* Let V = ( V1 V2 ) (V2: last K columns) 636*bf2c3715SXin Li* where V2 is unit lower triangular. 637*bf2c3715SXin Li* 638*bf2c3715SXin Li IF( LSAME( SIDE, 'L' ) ) THEN 639*bf2c3715SXin Li* 640*bf2c3715SXin Li* Form H * C or H**H * C where C = ( C1 ) 641*bf2c3715SXin Li* ( C2 ) 642*bf2c3715SXin Li* 643*bf2c3715SXin Li LASTV = MAX( K, ILACLC( K, M, V, LDV ) ) 644*bf2c3715SXin Li LASTC = ILACLC( LASTV, N, C, LDC ) 645*bf2c3715SXin Li* 646*bf2c3715SXin Li* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) 647*bf2c3715SXin Li* 648*bf2c3715SXin Li* W := C2**H 649*bf2c3715SXin Li* 650*bf2c3715SXin Li DO 190 J = 1, K 651*bf2c3715SXin Li CALL CCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, 652*bf2c3715SXin Li $ WORK( 1, J ), 1 ) 653*bf2c3715SXin Li CALL CLACGV( LASTC, WORK( 1, J ), 1 ) 654*bf2c3715SXin Li 190 CONTINUE 655*bf2c3715SXin Li* 656*bf2c3715SXin Li* W := W * V2**H 657*bf2c3715SXin Li* 658*bf2c3715SXin Li CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', 659*bf2c3715SXin Li $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, 660*bf2c3715SXin Li $ WORK, LDWORK ) 661*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 662*bf2c3715SXin Li* 663*bf2c3715SXin Li* W := W + C1**H * V1**H 664*bf2c3715SXin Li* 665*bf2c3715SXin Li CALL CGEMM( 'Conjugate transpose', 666*bf2c3715SXin Li $ 'Conjugate transpose', LASTC, K, LASTV-K, 667*bf2c3715SXin Li $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) 668*bf2c3715SXin Li END IF 669*bf2c3715SXin Li* 670*bf2c3715SXin Li* W := W * T**H or W * T 671*bf2c3715SXin Li* 672*bf2c3715SXin Li CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit', 673*bf2c3715SXin Li $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 674*bf2c3715SXin Li* 675*bf2c3715SXin Li* C := C - V**H * W**H 676*bf2c3715SXin Li* 677*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 678*bf2c3715SXin Li* 679*bf2c3715SXin Li* C1 := C1 - V1**H * W**H 680*bf2c3715SXin Li* 681*bf2c3715SXin Li CALL CGEMM( 'Conjugate transpose', 682*bf2c3715SXin Li $ 'Conjugate transpose', LASTV-K, LASTC, K, 683*bf2c3715SXin Li $ -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC ) 684*bf2c3715SXin Li END IF 685*bf2c3715SXin Li* 686*bf2c3715SXin Li* W := W * V2 687*bf2c3715SXin Li* 688*bf2c3715SXin Li CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', 689*bf2c3715SXin Li $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, 690*bf2c3715SXin Li $ WORK, LDWORK ) 691*bf2c3715SXin Li* 692*bf2c3715SXin Li* C2 := C2 - W**H 693*bf2c3715SXin Li* 694*bf2c3715SXin Li DO 210 J = 1, K 695*bf2c3715SXin Li DO 200 I = 1, LASTC 696*bf2c3715SXin Li C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - 697*bf2c3715SXin Li $ CONJG( WORK( I, J ) ) 698*bf2c3715SXin Li 200 CONTINUE 699*bf2c3715SXin Li 210 CONTINUE 700*bf2c3715SXin Li* 701*bf2c3715SXin Li ELSE IF( LSAME( SIDE, 'R' ) ) THEN 702*bf2c3715SXin Li* 703*bf2c3715SXin Li* Form C * H or C * H**H where C = ( C1 C2 ) 704*bf2c3715SXin Li* 705*bf2c3715SXin Li LASTV = MAX( K, ILACLC( K, N, V, LDV ) ) 706*bf2c3715SXin Li LASTC = ILACLR( M, LASTV, C, LDC ) 707*bf2c3715SXin Li* 708*bf2c3715SXin Li* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) 709*bf2c3715SXin Li* 710*bf2c3715SXin Li* W := C2 711*bf2c3715SXin Li* 712*bf2c3715SXin Li DO 220 J = 1, K 713*bf2c3715SXin Li CALL CCOPY( LASTC, C( 1, LASTV-K+J ), 1, 714*bf2c3715SXin Li $ WORK( 1, J ), 1 ) 715*bf2c3715SXin Li 220 CONTINUE 716*bf2c3715SXin Li* 717*bf2c3715SXin Li* W := W * V2**H 718*bf2c3715SXin Li* 719*bf2c3715SXin Li CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', 720*bf2c3715SXin Li $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, 721*bf2c3715SXin Li $ WORK, LDWORK ) 722*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 723*bf2c3715SXin Li* 724*bf2c3715SXin Li* W := W + C1 * V1**H 725*bf2c3715SXin Li* 726*bf2c3715SXin Li CALL CGEMM( 'No transpose', 'Conjugate transpose', 727*bf2c3715SXin Li $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, ONE, 728*bf2c3715SXin Li $ WORK, LDWORK ) 729*bf2c3715SXin Li END IF 730*bf2c3715SXin Li* 731*bf2c3715SXin Li* W := W * T or W * T**H 732*bf2c3715SXin Li* 733*bf2c3715SXin Li CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit', 734*bf2c3715SXin Li $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) 735*bf2c3715SXin Li* 736*bf2c3715SXin Li* C := C - W * V 737*bf2c3715SXin Li* 738*bf2c3715SXin Li IF( LASTV.GT.K ) THEN 739*bf2c3715SXin Li* 740*bf2c3715SXin Li* C1 := C1 - W * V1 741*bf2c3715SXin Li* 742*bf2c3715SXin Li CALL CGEMM( 'No transpose', 'No transpose', 743*bf2c3715SXin Li $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, 744*bf2c3715SXin Li $ ONE, C, LDC ) 745*bf2c3715SXin Li END IF 746*bf2c3715SXin Li* 747*bf2c3715SXin Li* W := W * V2 748*bf2c3715SXin Li* 749*bf2c3715SXin Li CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', 750*bf2c3715SXin Li $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, 751*bf2c3715SXin Li $ WORK, LDWORK ) 752*bf2c3715SXin Li* 753*bf2c3715SXin Li* C1 := C1 - W 754*bf2c3715SXin Li* 755*bf2c3715SXin Li DO 240 J = 1, K 756*bf2c3715SXin Li DO 230 I = 1, LASTC 757*bf2c3715SXin Li C( I, LASTV-K+J ) = C( I, LASTV-K+J ) 758*bf2c3715SXin Li $ - WORK( I, J ) 759*bf2c3715SXin Li 230 CONTINUE 760*bf2c3715SXin Li 240 CONTINUE 761*bf2c3715SXin Li* 762*bf2c3715SXin Li END IF 763*bf2c3715SXin Li* 764*bf2c3715SXin Li END IF 765*bf2c3715SXin Li END IF 766*bf2c3715SXin Li* 767*bf2c3715SXin Li RETURN 768*bf2c3715SXin Li* 769*bf2c3715SXin Li* End of CLARFB 770*bf2c3715SXin Li* 771*bf2c3715SXin Li END 772