Annotation of rpl/lapack/lapack/dlarfb_gett.f, revision 1.1
1.1 ! bertrand 1: *> \brief \b DLARFB_GETT
! 2: *
! 3: * =========== DOCUMENTATION ===========
! 4: *
! 5: * Online html documentation available at
! 6: * http://www.netlib.org/lapack/explore-html/
! 7: *
! 8: *> \htmlonly
! 9: *> Download DLARFB_GETT + dependencies
! 10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarfb_gett.f">
! 11: *> [TGZ]</a>
! 12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarfb_gett.f">
! 13: *> [ZIP]</a>
! 14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarfb_gett.f">
! 15: *> [TXT]</a>
! 16: *> \endhtmlonly
! 17: *
! 18: * Definition:
! 19: * ===========
! 20: *
! 21: * SUBROUTINE DLARFB_GETT( IDENT, M, N, K, T, LDT, A, LDA, B, LDB,
! 22: * $ WORK, LDWORK )
! 23: * IMPLICIT NONE
! 24: *
! 25: * .. Scalar Arguments ..
! 26: * CHARACTER IDENT
! 27: * INTEGER K, LDA, LDB, LDT, LDWORK, M, N
! 28: * ..
! 29: * .. Array Arguments ..
! 30: * DOUBLE PRECISION A( LDA, * ), B( LDB, * ), T( LDT, * ),
! 31: * $ WORK( LDWORK, * )
! 32: * ..
! 33: *
! 34: *> \par Purpose:
! 35: * =============
! 36: *>
! 37: *> \verbatim
! 38: *>
! 39: *> DLARFB_GETT applies a real Householder block reflector H from the
! 40: *> left to a real (K+M)-by-N "triangular-pentagonal" matrix
! 41: *> composed of two block matrices: an upper trapezoidal K-by-N matrix A
! 42: *> stored in the array A, and a rectangular M-by-(N-K) matrix B, stored
! 43: *> in the array B. The block reflector H is stored in a compact
! 44: *> WY-representation, where the elementary reflectors are in the
! 45: *> arrays A, B and T. See Further Details section.
! 46: *> \endverbatim
! 47: *
! 48: * Arguments:
! 49: * ==========
! 50: *
! 51: *> \param[in] IDENT
! 52: *> \verbatim
! 53: *> IDENT is CHARACTER*1
! 54: *> If IDENT = not 'I', or not 'i', then V1 is unit
! 55: *> lower-triangular and stored in the left K-by-K block of
! 56: *> the input matrix A,
! 57: *> If IDENT = 'I' or 'i', then V1 is an identity matrix and
! 58: *> not stored.
! 59: *> See Further Details section.
! 60: *> \endverbatim
! 61: *>
! 62: *> \param[in] M
! 63: *> \verbatim
! 64: *> M is INTEGER
! 65: *> The number of rows of the matrix B.
! 66: *> M >= 0.
! 67: *> \endverbatim
! 68: *>
! 69: *> \param[in] N
! 70: *> \verbatim
! 71: *> N is INTEGER
! 72: *> The number of columns of the matrices A and B.
! 73: *> N >= 0.
! 74: *> \endverbatim
! 75: *>
! 76: *> \param[in] K
! 77: *> \verbatim
! 78: *> K is INTEGER
! 79: *> The number or rows of the matrix A.
! 80: *> K is also order of the matrix T, i.e. the number of
! 81: *> elementary reflectors whose product defines the block
! 82: *> reflector. 0 <= K <= N.
! 83: *> \endverbatim
! 84: *>
! 85: *> \param[in] T
! 86: *> \verbatim
! 87: *> T is DOUBLE PRECISION array, dimension (LDT,K)
! 88: *> The upper-triangular K-by-K matrix T in the representation
! 89: *> of the block reflector.
! 90: *> \endverbatim
! 91: *>
! 92: *> \param[in] LDT
! 93: *> \verbatim
! 94: *> LDT is INTEGER
! 95: *> The leading dimension of the array T. LDT >= K.
! 96: *> \endverbatim
! 97: *>
! 98: *> \param[in,out] A
! 99: *> \verbatim
! 100: *> A is DOUBLE PRECISION array, dimension (LDA,N)
! 101: *>
! 102: *> On entry:
! 103: *> a) In the K-by-N upper-trapezoidal part A: input matrix A.
! 104: *> b) In the columns below the diagonal: columns of V1
! 105: *> (ones are not stored on the diagonal).
! 106: *>
! 107: *> On exit:
! 108: *> A is overwritten by rectangular K-by-N product H*A.
! 109: *>
! 110: *> See Further Details section.
! 111: *> \endverbatim
! 112: *>
! 113: *> \param[in] LDA
! 114: *> \verbatim
! 115: *> LDB is INTEGER
! 116: *> The leading dimension of the array A. LDA >= max(1,K).
! 117: *> \endverbatim
! 118: *>
! 119: *> \param[in,out] B
! 120: *> \verbatim
! 121: *> B is DOUBLE PRECISION array, dimension (LDB,N)
! 122: *>
! 123: *> On entry:
! 124: *> a) In the M-by-(N-K) right block: input matrix B.
! 125: *> b) In the M-by-N left block: columns of V2.
! 126: *>
! 127: *> On exit:
! 128: *> B is overwritten by rectangular M-by-N product H*B.
! 129: *>
! 130: *> See Further Details section.
! 131: *> \endverbatim
! 132: *>
! 133: *> \param[in] LDB
! 134: *> \verbatim
! 135: *> LDB is INTEGER
! 136: *> The leading dimension of the array B. LDB >= max(1,M).
! 137: *> \endverbatim
! 138: *>
! 139: *> \param[out] WORK
! 140: *> \verbatim
! 141: *> WORK is DOUBLE PRECISION array,
! 142: *> dimension (LDWORK,max(K,N-K))
! 143: *> \endverbatim
! 144: *>
! 145: *> \param[in] LDWORK
! 146: *> \verbatim
! 147: *> LDWORK is INTEGER
! 148: *> The leading dimension of the array WORK. LDWORK>=max(1,K).
! 149: *>
! 150: *> \endverbatim
! 151: *
! 152: * Authors:
! 153: * ========
! 154: *
! 155: *> \author Univ. of Tennessee
! 156: *> \author Univ. of California Berkeley
! 157: *> \author Univ. of Colorado Denver
! 158: *> \author NAG Ltd.
! 159: *
! 160: *> \ingroup doubleOTHERauxiliary
! 161: *
! 162: *> \par Contributors:
! 163: * ==================
! 164: *>
! 165: *> \verbatim
! 166: *>
! 167: *> November 2020, Igor Kozachenko,
! 168: *> Computer Science Division,
! 169: *> University of California, Berkeley
! 170: *>
! 171: *> \endverbatim
! 172: *
! 173: *> \par Further Details:
! 174: * =====================
! 175: *>
! 176: *> \verbatim
! 177: *>
! 178: *> (1) Description of the Algebraic Operation.
! 179: *>
! 180: *> The matrix A is a K-by-N matrix composed of two column block
! 181: *> matrices, A1, which is K-by-K, and A2, which is K-by-(N-K):
! 182: *> A = ( A1, A2 ).
! 183: *> The matrix B is an M-by-N matrix composed of two column block
! 184: *> matrices, B1, which is M-by-K, and B2, which is M-by-(N-K):
! 185: *> B = ( B1, B2 ).
! 186: *>
! 187: *> Perform the operation:
! 188: *>
! 189: *> ( A_out ) := H * ( A_in ) = ( I - V * T * V**T ) * ( A_in ) =
! 190: *> ( B_out ) ( B_in ) ( B_in )
! 191: *> = ( I - ( V1 ) * T * ( V1**T, V2**T ) ) * ( A_in )
! 192: *> ( V2 ) ( B_in )
! 193: *> On input:
! 194: *>
! 195: *> a) ( A_in ) consists of two block columns:
! 196: *> ( B_in )
! 197: *>
! 198: *> ( A_in ) = (( A1_in ) ( A2_in )) = (( A1_in ) ( A2_in ))
! 199: *> ( B_in ) (( B1_in ) ( B2_in )) (( 0 ) ( B2_in )),
! 200: *>
! 201: *> where the column blocks are:
! 202: *>
! 203: *> ( A1_in ) is a K-by-K upper-triangular matrix stored in the
! 204: *> upper triangular part of the array A(1:K,1:K).
! 205: *> ( B1_in ) is an M-by-K rectangular ZERO matrix and not stored.
! 206: *>
! 207: *> ( A2_in ) is a K-by-(N-K) rectangular matrix stored
! 208: *> in the array A(1:K,K+1:N).
! 209: *> ( B2_in ) is an M-by-(N-K) rectangular matrix stored
! 210: *> in the array B(1:M,K+1:N).
! 211: *>
! 212: *> b) V = ( V1 )
! 213: *> ( V2 )
! 214: *>
! 215: *> where:
! 216: *> 1) if IDENT == 'I',V1 is a K-by-K identity matrix, not stored;
! 217: *> 2) if IDENT != 'I',V1 is a K-by-K unit lower-triangular matrix,
! 218: *> stored in the lower-triangular part of the array
! 219: *> A(1:K,1:K) (ones are not stored),
! 220: *> and V2 is an M-by-K rectangular stored the array B(1:M,1:K),
! 221: *> (because on input B1_in is a rectangular zero
! 222: *> matrix that is not stored and the space is
! 223: *> used to store V2).
! 224: *>
! 225: *> c) T is a K-by-K upper-triangular matrix stored
! 226: *> in the array T(1:K,1:K).
! 227: *>
! 228: *> On output:
! 229: *>
! 230: *> a) ( A_out ) consists of two block columns:
! 231: *> ( B_out )
! 232: *>
! 233: *> ( A_out ) = (( A1_out ) ( A2_out ))
! 234: *> ( B_out ) (( B1_out ) ( B2_out )),
! 235: *>
! 236: *> where the column blocks are:
! 237: *>
! 238: *> ( A1_out ) is a K-by-K square matrix, or a K-by-K
! 239: *> upper-triangular matrix, if V1 is an
! 240: *> identity matrix. AiOut is stored in
! 241: *> the array A(1:K,1:K).
! 242: *> ( B1_out ) is an M-by-K rectangular matrix stored
! 243: *> in the array B(1:M,K:N).
! 244: *>
! 245: *> ( A2_out ) is a K-by-(N-K) rectangular matrix stored
! 246: *> in the array A(1:K,K+1:N).
! 247: *> ( B2_out ) is an M-by-(N-K) rectangular matrix stored
! 248: *> in the array B(1:M,K+1:N).
! 249: *>
! 250: *>
! 251: *> The operation above can be represented as the same operation
! 252: *> on each block column:
! 253: *>
! 254: *> ( A1_out ) := H * ( A1_in ) = ( I - V * T * V**T ) * ( A1_in )
! 255: *> ( B1_out ) ( 0 ) ( 0 )
! 256: *>
! 257: *> ( A2_out ) := H * ( A2_in ) = ( I - V * T * V**T ) * ( A2_in )
! 258: *> ( B2_out ) ( B2_in ) ( B2_in )
! 259: *>
! 260: *> If IDENT != 'I':
! 261: *>
! 262: *> The computation for column block 1:
! 263: *>
! 264: *> A1_out: = A1_in - V1*T*(V1**T)*A1_in
! 265: *>
! 266: *> B1_out: = - V2*T*(V1**T)*A1_in
! 267: *>
! 268: *> The computation for column block 2, which exists if N > K:
! 269: *>
! 270: *> A2_out: = A2_in - V1*T*( (V1**T)*A2_in + (V2**T)*B2_in )
! 271: *>
! 272: *> B2_out: = B2_in - V2*T*( (V1**T)*A2_in + (V2**T)*B2_in )
! 273: *>
! 274: *> If IDENT == 'I':
! 275: *>
! 276: *> The operation for column block 1:
! 277: *>
! 278: *> A1_out: = A1_in - V1*T**A1_in
! 279: *>
! 280: *> B1_out: = - V2*T**A1_in
! 281: *>
! 282: *> The computation for column block 2, which exists if N > K:
! 283: *>
! 284: *> A2_out: = A2_in - T*( A2_in + (V2**T)*B2_in )
! 285: *>
! 286: *> B2_out: = B2_in - V2*T*( A2_in + (V2**T)*B2_in )
! 287: *>
! 288: *> (2) Description of the Algorithmic Computation.
! 289: *>
! 290: *> In the first step, we compute column block 2, i.e. A2 and B2.
! 291: *> Here, we need to use the K-by-(N-K) rectangular workspace
! 292: *> matrix W2 that is of the same size as the matrix A2.
! 293: *> W2 is stored in the array WORK(1:K,1:(N-K)).
! 294: *>
! 295: *> In the second step, we compute column block 1, i.e. A1 and B1.
! 296: *> Here, we need to use the K-by-K square workspace matrix W1
! 297: *> that is of the same size as the as the matrix A1.
! 298: *> W1 is stored in the array WORK(1:K,1:K).
! 299: *>
! 300: *> NOTE: Hence, in this routine, we need the workspace array WORK
! 301: *> only of size WORK(1:K,1:max(K,N-K)) so it can hold both W2 from
! 302: *> the first step and W1 from the second step.
! 303: *>
! 304: *> Case (A), when V1 is unit lower-triangular, i.e. IDENT != 'I',
! 305: *> more computations than in the Case (B).
! 306: *>
! 307: *> if( IDENT != 'I' ) then
! 308: *> if ( N > K ) then
! 309: *> (First Step - column block 2)
! 310: *> col2_(1) W2: = A2
! 311: *> col2_(2) W2: = (V1**T) * W2 = (unit_lower_tr_of_(A1)**T) * W2
! 312: *> col2_(3) W2: = W2 + (V2**T) * B2 = W2 + (B1**T) * B2
! 313: *> col2_(4) W2: = T * W2
! 314: *> col2_(5) B2: = B2 - V2 * W2 = B2 - B1 * W2
! 315: *> col2_(6) W2: = V1 * W2 = unit_lower_tr_of_(A1) * W2
! 316: *> col2_(7) A2: = A2 - W2
! 317: *> else
! 318: *> (Second Step - column block 1)
! 319: *> col1_(1) W1: = A1
! 320: *> col1_(2) W1: = (V1**T) * W1 = (unit_lower_tr_of_(A1)**T) * W1
! 321: *> col1_(3) W1: = T * W1
! 322: *> col1_(4) B1: = - V2 * W1 = - B1 * W1
! 323: *> col1_(5) square W1: = V1 * W1 = unit_lower_tr_of_(A1) * W1
! 324: *> col1_(6) square A1: = A1 - W1
! 325: *> end if
! 326: *> end if
! 327: *>
! 328: *> Case (B), when V1 is an identity matrix, i.e. IDENT == 'I',
! 329: *> less computations than in the Case (A)
! 330: *>
! 331: *> if( IDENT == 'I' ) then
! 332: *> if ( N > K ) then
! 333: *> (First Step - column block 2)
! 334: *> col2_(1) W2: = A2
! 335: *> col2_(3) W2: = W2 + (V2**T) * B2 = W2 + (B1**T) * B2
! 336: *> col2_(4) W2: = T * W2
! 337: *> col2_(5) B2: = B2 - V2 * W2 = B2 - B1 * W2
! 338: *> col2_(7) A2: = A2 - W2
! 339: *> else
! 340: *> (Second Step - column block 1)
! 341: *> col1_(1) W1: = A1
! 342: *> col1_(3) W1: = T * W1
! 343: *> col1_(4) B1: = - V2 * W1 = - B1 * W1
! 344: *> col1_(6) upper-triangular_of_(A1): = A1 - W1
! 345: *> end if
! 346: *> end if
! 347: *>
! 348: *> Combine these cases (A) and (B) together, this is the resulting
! 349: *> algorithm:
! 350: *>
! 351: *> if ( N > K ) then
! 352: *>
! 353: *> (First Step - column block 2)
! 354: *>
! 355: *> col2_(1) W2: = A2
! 356: *> if( IDENT != 'I' ) then
! 357: *> col2_(2) W2: = (V1**T) * W2
! 358: *> = (unit_lower_tr_of_(A1)**T) * W2
! 359: *> end if
! 360: *> col2_(3) W2: = W2 + (V2**T) * B2 = W2 + (B1**T) * B2]
! 361: *> col2_(4) W2: = T * W2
! 362: *> col2_(5) B2: = B2 - V2 * W2 = B2 - B1 * W2
! 363: *> if( IDENT != 'I' ) then
! 364: *> col2_(6) W2: = V1 * W2 = unit_lower_tr_of_(A1) * W2
! 365: *> end if
! 366: *> col2_(7) A2: = A2 - W2
! 367: *>
! 368: *> else
! 369: *>
! 370: *> (Second Step - column block 1)
! 371: *>
! 372: *> col1_(1) W1: = A1
! 373: *> if( IDENT != 'I' ) then
! 374: *> col1_(2) W1: = (V1**T) * W1
! 375: *> = (unit_lower_tr_of_(A1)**T) * W1
! 376: *> end if
! 377: *> col1_(3) W1: = T * W1
! 378: *> col1_(4) B1: = - V2 * W1 = - B1 * W1
! 379: *> if( IDENT != 'I' ) then
! 380: *> col1_(5) square W1: = V1 * W1 = unit_lower_tr_of_(A1) * W1
! 381: *> col1_(6_a) below_diag_of_(A1): = - below_diag_of_(W1)
! 382: *> end if
! 383: *> col1_(6_b) up_tr_of_(A1): = up_tr_of_(A1) - up_tr_of_(W1)
! 384: *>
! 385: *> end if
! 386: *>
! 387: *> \endverbatim
! 388: *>
! 389: * =====================================================================
! 390: SUBROUTINE DLARFB_GETT( IDENT, M, N, K, T, LDT, A, LDA, B, LDB,
! 391: $ WORK, LDWORK )
! 392: IMPLICIT NONE
! 393: *
! 394: * -- LAPACK auxiliary routine --
! 395: * -- LAPACK is a software package provided by Univ. of Tennessee, --
! 396: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
! 397: *
! 398: * .. Scalar Arguments ..
! 399: CHARACTER IDENT
! 400: INTEGER K, LDA, LDB, LDT, LDWORK, M, N
! 401: * ..
! 402: * .. Array Arguments ..
! 403: DOUBLE PRECISION A( LDA, * ), B( LDB, * ), T( LDT, * ),
! 404: $ WORK( LDWORK, * )
! 405: * ..
! 406: *
! 407: * =====================================================================
! 408: *
! 409: * .. Parameters ..
! 410: DOUBLE PRECISION ONE, ZERO
! 411: PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
! 412: * ..
! 413: * .. Local Scalars ..
! 414: LOGICAL LNOTIDENT
! 415: INTEGER I, J
! 416: * ..
! 417: * .. EXTERNAL FUNCTIONS ..
! 418: LOGICAL LSAME
! 419: EXTERNAL LSAME
! 420: * ..
! 421: * .. External Subroutines ..
! 422: EXTERNAL DCOPY, DGEMM, DTRMM
! 423: * ..
! 424: * .. Executable Statements ..
! 425: *
! 426: * Quick return if possible
! 427: *
! 428: IF( M.LT.0 .OR. N.LE.0 .OR. K.EQ.0 .OR. K.GT.N )
! 429: $ RETURN
! 430: *
! 431: LNOTIDENT = .NOT.LSAME( IDENT, 'I' )
! 432: *
! 433: * ------------------------------------------------------------------
! 434: *
! 435: * First Step. Computation of the Column Block 2:
! 436: *
! 437: * ( A2 ) := H * ( A2 )
! 438: * ( B2 ) ( B2 )
! 439: *
! 440: * ------------------------------------------------------------------
! 441: *
! 442: IF( N.GT.K ) THEN
! 443: *
! 444: * col2_(1) Compute W2: = A2. Therefore, copy A2 = A(1:K, K+1:N)
! 445: * into W2=WORK(1:K, 1:N-K) column-by-column.
! 446: *
! 447: DO J = 1, N-K
! 448: CALL DCOPY( K, A( 1, K+J ), 1, WORK( 1, J ), 1 )
! 449: END DO
! 450:
! 451: IF( LNOTIDENT ) THEN
! 452: *
! 453: * col2_(2) Compute W2: = (V1**T) * W2 = (A1**T) * W2,
! 454: * V1 is not an identy matrix, but unit lower-triangular
! 455: * V1 stored in A1 (diagonal ones are not stored).
! 456: *
! 457: *
! 458: CALL DTRMM( 'L', 'L', 'T', 'U', K, N-K, ONE, A, LDA,
! 459: $ WORK, LDWORK )
! 460: END IF
! 461: *
! 462: * col2_(3) Compute W2: = W2 + (V2**T) * B2 = W2 + (B1**T) * B2
! 463: * V2 stored in B1.
! 464: *
! 465: IF( M.GT.0 ) THEN
! 466: CALL DGEMM( 'T', 'N', K, N-K, M, ONE, B, LDB,
! 467: $ B( 1, K+1 ), LDB, ONE, WORK, LDWORK )
! 468: END IF
! 469: *
! 470: * col2_(4) Compute W2: = T * W2,
! 471: * T is upper-triangular.
! 472: *
! 473: CALL DTRMM( 'L', 'U', 'N', 'N', K, N-K, ONE, T, LDT,
! 474: $ WORK, LDWORK )
! 475: *
! 476: * col2_(5) Compute B2: = B2 - V2 * W2 = B2 - B1 * W2,
! 477: * V2 stored in B1.
! 478: *
! 479: IF( M.GT.0 ) THEN
! 480: CALL DGEMM( 'N', 'N', M, N-K, K, -ONE, B, LDB,
! 481: $ WORK, LDWORK, ONE, B( 1, K+1 ), LDB )
! 482: END IF
! 483: *
! 484: IF( LNOTIDENT ) THEN
! 485: *
! 486: * col2_(6) Compute W2: = V1 * W2 = A1 * W2,
! 487: * V1 is not an identity matrix, but unit lower-triangular,
! 488: * V1 stored in A1 (diagonal ones are not stored).
! 489: *
! 490: CALL DTRMM( 'L', 'L', 'N', 'U', K, N-K, ONE, A, LDA,
! 491: $ WORK, LDWORK )
! 492: END IF
! 493: *
! 494: * col2_(7) Compute A2: = A2 - W2 =
! 495: * = A(1:K, K+1:N-K) - WORK(1:K, 1:N-K),
! 496: * column-by-column.
! 497: *
! 498: DO J = 1, N-K
! 499: DO I = 1, K
! 500: A( I, K+J ) = A( I, K+J ) - WORK( I, J )
! 501: END DO
! 502: END DO
! 503: *
! 504: END IF
! 505: *
! 506: * ------------------------------------------------------------------
! 507: *
! 508: * Second Step. Computation of the Column Block 1:
! 509: *
! 510: * ( A1 ) := H * ( A1 )
! 511: * ( B1 ) ( 0 )
! 512: *
! 513: * ------------------------------------------------------------------
! 514: *
! 515: * col1_(1) Compute W1: = A1. Copy the upper-triangular
! 516: * A1 = A(1:K, 1:K) into the upper-triangular
! 517: * W1 = WORK(1:K, 1:K) column-by-column.
! 518: *
! 519: DO J = 1, K
! 520: CALL DCOPY( J, A( 1, J ), 1, WORK( 1, J ), 1 )
! 521: END DO
! 522: *
! 523: * Set the subdiagonal elements of W1 to zero column-by-column.
! 524: *
! 525: DO J = 1, K - 1
! 526: DO I = J + 1, K
! 527: WORK( I, J ) = ZERO
! 528: END DO
! 529: END DO
! 530: *
! 531: IF( LNOTIDENT ) THEN
! 532: *
! 533: * col1_(2) Compute W1: = (V1**T) * W1 = (A1**T) * W1,
! 534: * V1 is not an identity matrix, but unit lower-triangular
! 535: * V1 stored in A1 (diagonal ones are not stored),
! 536: * W1 is upper-triangular with zeroes below the diagonal.
! 537: *
! 538: CALL DTRMM( 'L', 'L', 'T', 'U', K, K, ONE, A, LDA,
! 539: $ WORK, LDWORK )
! 540: END IF
! 541: *
! 542: * col1_(3) Compute W1: = T * W1,
! 543: * T is upper-triangular,
! 544: * W1 is upper-triangular with zeroes below the diagonal.
! 545: *
! 546: CALL DTRMM( 'L', 'U', 'N', 'N', K, K, ONE, T, LDT,
! 547: $ WORK, LDWORK )
! 548: *
! 549: * col1_(4) Compute B1: = - V2 * W1 = - B1 * W1,
! 550: * V2 = B1, W1 is upper-triangular with zeroes below the diagonal.
! 551: *
! 552: IF( M.GT.0 ) THEN
! 553: CALL DTRMM( 'R', 'U', 'N', 'N', M, K, -ONE, WORK, LDWORK,
! 554: $ B, LDB )
! 555: END IF
! 556: *
! 557: IF( LNOTIDENT ) THEN
! 558: *
! 559: * col1_(5) Compute W1: = V1 * W1 = A1 * W1,
! 560: * V1 is not an identity matrix, but unit lower-triangular
! 561: * V1 stored in A1 (diagonal ones are not stored),
! 562: * W1 is upper-triangular on input with zeroes below the diagonal,
! 563: * and square on output.
! 564: *
! 565: CALL DTRMM( 'L', 'L', 'N', 'U', K, K, ONE, A, LDA,
! 566: $ WORK, LDWORK )
! 567: *
! 568: * col1_(6) Compute A1: = A1 - W1 = A(1:K, 1:K) - WORK(1:K, 1:K)
! 569: * column-by-column. A1 is upper-triangular on input.
! 570: * If IDENT, A1 is square on output, and W1 is square,
! 571: * if NOT IDENT, A1 is upper-triangular on output,
! 572: * W1 is upper-triangular.
! 573: *
! 574: * col1_(6)_a Compute elements of A1 below the diagonal.
! 575: *
! 576: DO J = 1, K - 1
! 577: DO I = J + 1, K
! 578: A( I, J ) = - WORK( I, J )
! 579: END DO
! 580: END DO
! 581: *
! 582: END IF
! 583: *
! 584: * col1_(6)_b Compute elements of A1 on and above the diagonal.
! 585: *
! 586: DO J = 1, K
! 587: DO I = 1, J
! 588: A( I, J ) = A( I, J ) - WORK( I, J )
! 589: END DO
! 590: END DO
! 591: *
! 592: RETURN
! 593: *
! 594: * End of DLARFB_GETT
! 595: *
! 596: END
CVSweb interface <joel.bertrand@systella.fr>