| Carlos Hernandez | 7faaa9f | 2014-08-05 17:53:32 -0700 | [diff] [blame] | 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 |