LAPACK 3.3.0

dlarfb.f

Go to the documentation of this file.
00001       SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
00002      $                   T, LDT, C, LDC, WORK, LDWORK )
00003       IMPLICIT NONE
00004 *
00005 *  -- LAPACK auxiliary routine (version 3.2) --
00006 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
00007 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00008 *     November 2006
00009 *
00010 *     .. Scalar Arguments ..
00011       CHARACTER          DIRECT, SIDE, STOREV, TRANS
00012       INTEGER            K, LDC, LDT, LDV, LDWORK, M, N
00013 *     ..
00014 *     .. Array Arguments ..
00015       DOUBLE PRECISION   C( LDC, * ), T( LDT, * ), V( LDV, * ),
00016      $                   WORK( LDWORK, * )
00017 *     ..
00018 *
00019 *  Purpose
00020 *  =======
00021 *
00022 *  DLARFB applies a real block reflector H or its transpose H' to a
00023 *  real m by n matrix C, from either the left or the right.
00024 *
00025 *  Arguments
00026 *  =========
00027 *
00028 *  SIDE    (input) CHARACTER*1
00029 *          = 'L': apply H or H' from the Left
00030 *          = 'R': apply H or H' from the Right
00031 *
00032 *  TRANS   (input) CHARACTER*1
00033 *          = 'N': apply H (No transpose)
00034 *          = 'T': apply H' (Transpose)
00035 *
00036 *  DIRECT  (input) CHARACTER*1
00037 *          Indicates how H is formed from a product of elementary
00038 *          reflectors
00039 *          = 'F': H = H(1) H(2) . . . H(k) (Forward)
00040 *          = 'B': H = H(k) . . . H(2) H(1) (Backward)
00041 *
00042 *  STOREV  (input) CHARACTER*1
00043 *          Indicates how the vectors which define the elementary
00044 *          reflectors are stored:
00045 *          = 'C': Columnwise
00046 *          = 'R': Rowwise
00047 *
00048 *  M       (input) INTEGER
00049 *          The number of rows of the matrix C.
00050 *
00051 *  N       (input) INTEGER
00052 *          The number of columns of the matrix C.
00053 *
00054 *  K       (input) INTEGER
00055 *          The order of the matrix T (= the number of elementary
00056 *          reflectors whose product defines the block reflector).
00057 *
00058 *  V       (input) DOUBLE PRECISION array, dimension
00059 *                                (LDV,K) if STOREV = 'C'
00060 *                                (LDV,M) if STOREV = 'R' and SIDE = 'L'
00061 *                                (LDV,N) if STOREV = 'R' and SIDE = 'R'
00062 *          The matrix V. See further details.
00063 *
00064 *  LDV     (input) INTEGER
00065 *          The leading dimension of the array V.
00066 *          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M);
00067 *          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N);
00068 *          if STOREV = 'R', LDV >= K.
00069 *
00070 *  T       (input) DOUBLE PRECISION array, dimension (LDT,K)
00071 *          The triangular k by k matrix T in the representation of the
00072 *          block reflector.
00073 *
00074 *  LDT     (input) INTEGER
00075 *          The leading dimension of the array T. LDT >= K.
00076 *
00077 *  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
00078 *          On entry, the m by n matrix C.
00079 *          On exit, C is overwritten by H*C or H'*C or C*H or C*H'.
00080 *
00081 *  LDC     (input) INTEGER
00082 *          The leading dimension of the array C. LDA >= max(1,M).
00083 *
00084 *  WORK    (workspace) DOUBLE PRECISION array, dimension (LDWORK,K)
00085 *
00086 *  LDWORK  (input) INTEGER
00087 *          The leading dimension of the array WORK.
00088 *          If SIDE = 'L', LDWORK >= max(1,N);
00089 *          if SIDE = 'R', LDWORK >= max(1,M).
00090 *
00091 *  =====================================================================
00092 *
00093 *     .. Parameters ..
00094       DOUBLE PRECISION   ONE
00095       PARAMETER          ( ONE = 1.0D+0 )
00096 *     ..
00097 *     .. Local Scalars ..
00098       CHARACTER          TRANST
00099       INTEGER            I, J, LASTV, LASTC
00100 *     ..
00101 *     .. External Functions ..
00102       LOGICAL            LSAME
00103       INTEGER            ILADLR, ILADLC
00104       EXTERNAL           LSAME, ILADLR, ILADLC
00105 *     ..
00106 *     .. External Subroutines ..
00107       EXTERNAL           DCOPY, DGEMM, DTRMM
00108 *     ..
00109 *     .. Executable Statements ..
00110 *
00111 *     Quick return if possible
00112 *
00113       IF( M.LE.0 .OR. N.LE.0 )
00114      $   RETURN
00115 *
00116       IF( LSAME( TRANS, 'N' ) ) THEN
00117          TRANST = 'T'
00118       ELSE
00119          TRANST = 'N'
00120       END IF
00121 *
00122       IF( LSAME( STOREV, 'C' ) ) THEN
00123 *
00124          IF( LSAME( DIRECT, 'F' ) ) THEN
00125 *
00126 *           Let  V =  ( V1 )    (first K rows)
00127 *                     ( V2 )
00128 *           where  V1  is unit lower triangular.
00129 *
00130             IF( LSAME( SIDE, 'L' ) ) THEN
00131 *
00132 *              Form  H * C  or  H' * C  where  C = ( C1 )
00133 *                                                  ( C2 )
00134 *
00135                LASTV = MAX( K, ILADLR( M, K, V, LDV ) )
00136                LASTC = ILADLC( LASTV, N, C, LDC )
00137 *
00138 *              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
00139 *
00140 *              W := C1'
00141 *
00142                DO 10 J = 1, K
00143                   CALL DCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )
00144    10          CONTINUE
00145 *
00146 *              W := W * V1
00147 *
00148                CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
00149      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
00150                IF( LASTV.GT.K ) THEN
00151 *
00152 *                 W := W + C2'*V2
00153 *
00154                   CALL DGEMM( 'Transpose', 'No transpose',
00155      $                 LASTC, K, LASTV-K,
00156      $                 ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV,
00157      $                 ONE, WORK, LDWORK )
00158                END IF
00159 *
00160 *              W := W * T'  or  W * T
00161 *
00162                CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit',
00163      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
00164 *
00165 *              C := C - V * W'
00166 *
00167                IF( LASTV.GT.K ) THEN
00168 *
00169 *                 C2 := C2 - V2 * W'
00170 *
00171                   CALL DGEMM( 'No transpose', 'Transpose',
00172      $                 LASTV-K, LASTC, K,
00173      $                 -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE,
00174      $                 C( K+1, 1 ), LDC )
00175                END IF
00176 *
00177 *              W := W * V1'
00178 *
00179                CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',
00180      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
00181 *
00182 *              C1 := C1 - W'
00183 *
00184                DO 30 J = 1, K
00185                   DO 20 I = 1, LASTC
00186                      C( J, I ) = C( J, I ) - WORK( I, J )
00187    20             CONTINUE
00188    30          CONTINUE
00189 *
00190             ELSE IF( LSAME( SIDE, 'R' ) ) THEN
00191 *
00192 *              Form  C * H  or  C * H'  where  C = ( C1  C2 )
00193 *
00194                LASTV = MAX( K, ILADLR( N, K, V, LDV ) )
00195                LASTC = ILADLR( M, LASTV, C, LDC )
00196 *
00197 *              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
00198 *
00199 *              W := C1
00200 *
00201                DO 40 J = 1, K
00202                   CALL DCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )
00203    40          CONTINUE
00204 *
00205 *              W := W * V1
00206 *
00207                CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
00208      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
00209                IF( LASTV.GT.K ) THEN
00210 *
00211 *                 W := W + C2 * V2
00212 *
00213                   CALL DGEMM( 'No transpose', 'No transpose',
00214      $                 LASTC, K, LASTV-K,
00215      $                 ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
00216      $                 ONE, WORK, LDWORK )
00217                END IF
00218 *
00219 *              W := W * T  or  W * T'
00220 *
00221                CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit',
00222      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
00223 *
00224 *              C := C - W * V'
00225 *
00226                IF( LASTV.GT.K ) THEN
00227 *
00228 *                 C2 := C2 - W * V2'
00229 *
00230                   CALL DGEMM( 'No transpose', 'Transpose',
00231      $                 LASTC, LASTV-K, K,
00232      $                 -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE,
00233      $                 C( 1, K+1 ), LDC )
00234                END IF
00235 *
00236 *              W := W * V1'
00237 *
00238                CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',
00239      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
00240 *
00241 *              C1 := C1 - W
00242 *
00243                DO 60 J = 1, K
00244                   DO 50 I = 1, LASTC
00245                      C( I, J ) = C( I, J ) - WORK( I, J )
00246    50             CONTINUE
00247    60          CONTINUE
00248             END IF
00249 *
00250          ELSE
00251 *
00252 *           Let  V =  ( V1 )
00253 *                     ( V2 )    (last K rows)
00254 *           where  V2  is unit upper triangular.
00255 *
00256             IF( LSAME( SIDE, 'L' ) ) THEN
00257 *
00258 *              Form  H * C  or  H' * C  where  C = ( C1 )
00259 *                                                  ( C2 )
00260 *
00261                LASTV = MAX( K, ILADLR( M, K, V, LDV ) )
00262                LASTC = ILADLC( LASTV, N, C, LDC )
00263 *
00264 *              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK)
00265 *
00266 *              W := C2'
00267 *
00268                DO 70 J = 1, K
00269                   CALL DCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,
00270      $                 WORK( 1, J ), 1 )
00271    70          CONTINUE
00272 *
00273 *              W := W * V2
00274 *
00275                CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
00276      $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
00277      $              WORK, LDWORK )
00278                IF( LASTV.GT.K ) THEN
00279 *
00280 *                 W := W + C1'*V1
00281 *
00282                   CALL DGEMM( 'Transpose', 'No transpose',
00283      $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,
00284      $                 ONE, WORK, LDWORK )
00285                END IF
00286 *
00287 *              W := W * T'  or  W * T
00288 *
00289                CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit',
00290      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
00291 *
00292 *              C := C - V * W'
00293 *
00294                IF( LASTV.GT.K ) THEN
00295 *
00296 *                 C1 := C1 - V1 * W'
00297 *
00298                   CALL DGEMM( 'No transpose', 'Transpose',
00299      $                 LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK,
00300      $                 ONE, C, LDC )
00301                END IF
00302 *
00303 *              W := W * V2'
00304 *
00305                CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',
00306      $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
00307      $              WORK, LDWORK )
00308 *
00309 *              C2 := C2 - W'
00310 *
00311                DO 90 J = 1, K
00312                   DO 80 I = 1, LASTC
00313                      C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J)
00314    80             CONTINUE
00315    90          CONTINUE
00316 *
00317             ELSE IF( LSAME( SIDE, 'R' ) ) THEN
00318 *
00319 *              Form  C * H  or  C * H'  where  C = ( C1  C2 )
00320 *
00321                LASTV = MAX( K, ILADLR( N, K, V, LDV ) )
00322                LASTC = ILADLR( M, LASTV, C, LDC )
00323 *
00324 *              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK)
00325 *
00326 *              W := C2
00327 *
00328                DO 100 J = 1, K
00329                   CALL DCOPY( LASTC, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
00330   100          CONTINUE
00331 *
00332 *              W := W * V2
00333 *
00334                CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
00335      $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
00336      $              WORK, LDWORK )
00337                IF( LASTV.GT.K ) THEN
00338 *
00339 *                 W := W + C1 * V1
00340 *
00341                   CALL DGEMM( 'No transpose', 'No transpose',
00342      $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,
00343      $                 ONE, WORK, LDWORK )
00344                END IF
00345 *
00346 *              W := W * T  or  W * T'
00347 *
00348                CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit',
00349      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
00350 *
00351 *              C := C - W * V'
00352 *
00353                IF( LASTV.GT.K ) THEN
00354 *
00355 *                 C1 := C1 - W * V1'
00356 *
00357                   CALL DGEMM( 'No transpose', 'Transpose',
00358      $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,
00359      $                 ONE, C, LDC )
00360                END IF
00361 *
00362 *              W := W * V2'
00363 *
00364                CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',
00365      $              LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV,
00366      $              WORK, LDWORK )
00367 *
00368 *              C2 := C2 - W
00369 *
00370                DO 120 J = 1, K
00371                   DO 110 I = 1, LASTC
00372                      C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J)
00373   110             CONTINUE
00374   120          CONTINUE
00375             END IF
00376          END IF
00377 *
00378       ELSE IF( LSAME( STOREV, 'R' ) ) THEN
00379 *
00380          IF( LSAME( DIRECT, 'F' ) ) THEN
00381 *
00382 *           Let  V =  ( V1  V2 )    (V1: first K columns)
00383 *           where  V1  is unit upper triangular.
00384 *
00385             IF( LSAME( SIDE, 'L' ) ) THEN
00386 *
00387 *              Form  H * C  or  H' * C  where  C = ( C1 )
00388 *                                                  ( C2 )
00389 *
00390                LASTV = MAX( K, ILADLC( K, M, V, LDV ) )
00391                LASTC = ILADLC( LASTV, N, C, LDC )
00392 *
00393 *              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
00394 *
00395 *              W := C1'
00396 *
00397                DO 130 J = 1, K
00398                   CALL DCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 )
00399   130          CONTINUE
00400 *
00401 *              W := W * V1'
00402 *
00403                CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',
00404      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
00405                IF( LASTV.GT.K ) THEN
00406 *
00407 *                 W := W + C2'*V2'
00408 *
00409                   CALL DGEMM( 'Transpose', 'Transpose',
00410      $                 LASTC, K, LASTV-K,
00411      $                 ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV,
00412      $                 ONE, WORK, LDWORK )
00413                END IF
00414 *
00415 *              W := W * T'  or  W * T
00416 *
00417                CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit',
00418      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
00419 *
00420 *              C := C - V' * W'
00421 *
00422                IF( LASTV.GT.K ) THEN
00423 *
00424 *                 C2 := C2 - V2' * W'
00425 *
00426                   CALL DGEMM( 'Transpose', 'Transpose',
00427      $                 LASTV-K, LASTC, K,
00428      $                 -ONE, V( 1, K+1 ), LDV, WORK, LDWORK,
00429      $                 ONE, C( K+1, 1 ), LDC )
00430                END IF
00431 *
00432 *              W := W * V1
00433 *
00434                CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
00435      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
00436 *
00437 *              C1 := C1 - W'
00438 *
00439                DO 150 J = 1, K
00440                   DO 140 I = 1, LASTC
00441                      C( J, I ) = C( J, I ) - WORK( I, J )
00442   140             CONTINUE
00443   150          CONTINUE
00444 *
00445             ELSE IF( LSAME( SIDE, 'R' ) ) THEN
00446 *
00447 *              Form  C * H  or  C * H'  where  C = ( C1  C2 )
00448 *
00449                LASTV = MAX( K, ILADLC( K, N, V, LDV ) )
00450                LASTC = ILADLR( M, LASTV, C, LDC )
00451 *
00452 *              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
00453 *
00454 *              W := C1
00455 *
00456                DO 160 J = 1, K
00457                   CALL DCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 )
00458   160          CONTINUE
00459 *
00460 *              W := W * V1'
00461 *
00462                CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit',
00463      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
00464                IF( LASTV.GT.K ) THEN
00465 *
00466 *                 W := W + C2 * V2'
00467 *
00468                   CALL DGEMM( 'No transpose', 'Transpose',
00469      $                 LASTC, K, LASTV-K,
00470      $                 ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV,
00471      $                 ONE, WORK, LDWORK )
00472                END IF
00473 *
00474 *              W := W * T  or  W * T'
00475 *
00476                CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit',
00477      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
00478 *
00479 *              C := C - W * V
00480 *
00481                IF( LASTV.GT.K ) THEN
00482 *
00483 *                 C2 := C2 - W * V2
00484 *
00485                   CALL DGEMM( 'No transpose', 'No transpose',
00486      $                 LASTC, LASTV-K, K,
00487      $                 -ONE, WORK, LDWORK, V( 1, K+1 ), LDV,
00488      $                 ONE, C( 1, K+1 ), LDC )
00489                END IF
00490 *
00491 *              W := W * V1
00492 *
00493                CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
00494      $              LASTC, K, ONE, V, LDV, WORK, LDWORK )
00495 *
00496 *              C1 := C1 - W
00497 *
00498                DO 180 J = 1, K
00499                   DO 170 I = 1, LASTC
00500                      C( I, J ) = C( I, J ) - WORK( I, J )
00501   170             CONTINUE
00502   180          CONTINUE
00503 *
00504             END IF
00505 *
00506          ELSE
00507 *
00508 *           Let  V =  ( V1  V2 )    (V2: last K columns)
00509 *           where  V2  is unit lower triangular.
00510 *
00511             IF( LSAME( SIDE, 'L' ) ) THEN
00512 *
00513 *              Form  H * C  or  H' * C  where  C = ( C1 )
00514 *                                                  ( C2 )
00515 *
00516                LASTV = MAX( K, ILADLC( K, M, V, LDV ) )
00517                LASTC = ILADLC( LASTV, N, C, LDC )
00518 *
00519 *              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK)
00520 *
00521 *              W := C2'
00522 *
00523                DO 190 J = 1, K
00524                   CALL DCOPY( LASTC, C( LASTV-K+J, 1 ), LDC,
00525      $                 WORK( 1, J ), 1 )
00526   190          CONTINUE
00527 *
00528 *              W := W * V2'
00529 *
00530                CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',
00531      $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
00532      $              WORK, LDWORK )
00533                IF( LASTV.GT.K ) THEN
00534 *
00535 *                 W := W + C1'*V1'
00536 *
00537                   CALL DGEMM( 'Transpose', 'Transpose',
00538      $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,
00539      $                 ONE, WORK, LDWORK )
00540                END IF
00541 *
00542 *              W := W * T'  or  W * T
00543 *
00544                CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit',
00545      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
00546 *
00547 *              C := C - V' * W'
00548 *
00549                IF( LASTV.GT.K ) THEN
00550 *
00551 *                 C1 := C1 - V1' * W'
00552 *
00553                   CALL DGEMM( 'Transpose', 'Transpose',
00554      $                 LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK,
00555      $                 ONE, C, LDC )
00556                END IF
00557 *
00558 *              W := W * V2
00559 *
00560                CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
00561      $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
00562      $              WORK, LDWORK )
00563 *
00564 *              C2 := C2 - W'
00565 *
00566                DO 210 J = 1, K
00567                   DO 200 I = 1, LASTC
00568                      C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J)
00569   200             CONTINUE
00570   210          CONTINUE
00571 *
00572             ELSE IF( LSAME( SIDE, 'R' ) ) THEN
00573 *
00574 *              Form  C * H  or  C * H'  where  C = ( C1  C2 )
00575 *
00576                LASTV = MAX( K, ILADLC( K, N, V, LDV ) )
00577                LASTC = ILADLR( M, LASTV, C, LDC )
00578 *
00579 *              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK)
00580 *
00581 *              W := C2
00582 *
00583                DO 220 J = 1, K
00584                   CALL DCOPY( LASTC, C( 1, LASTV-K+J ), 1,
00585      $                 WORK( 1, J ), 1 )
00586   220          CONTINUE
00587 *
00588 *              W := W * V2'
00589 *
00590                CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit',
00591      $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
00592      $              WORK, LDWORK )
00593                IF( LASTV.GT.K ) THEN
00594 *
00595 *                 W := W + C1 * V1'
00596 *
00597                   CALL DGEMM( 'No transpose', 'Transpose',
00598      $                 LASTC, K, LASTV-K, ONE, C, LDC, V, LDV,
00599      $                 ONE, WORK, LDWORK )
00600                END IF
00601 *
00602 *              W := W * T  or  W * T'
00603 *
00604                CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit',
00605      $              LASTC, K, ONE, T, LDT, WORK, LDWORK )
00606 *
00607 *              C := C - W * V
00608 *
00609                IF( LASTV.GT.K ) THEN
00610 *
00611 *                 C1 := C1 - W * V1
00612 *
00613                   CALL DGEMM( 'No transpose', 'No transpose',
00614      $                 LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV,
00615      $                 ONE, C, LDC )
00616                END IF
00617 *
00618 *              W := W * V2
00619 *
00620                CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
00621      $              LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV,
00622      $              WORK, LDWORK )
00623 *
00624 *              C1 := C1 - W
00625 *
00626                DO 240 J = 1, K
00627                   DO 230 I = 1, LASTC
00628                      C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J)
00629   230             CONTINUE
00630   240          CONTINUE
00631 *
00632             END IF
00633 *
00634          END IF
00635       END IF
00636 *
00637       RETURN
00638 *
00639 *     End of DLARFB
00640 *
00641       END
 All Files Functions