SRC/slarfb_gett.f(3)
SRC/slarfb_gett.f(3) ๐
okay so this page is from the Library Functions Manual, and itโs all about SRC/slarfb_gett.f. vibe check: itโs a Fortran subroutine page, bestie, and weโre keeping every single detail. no cap. โจ
NAME ๐ธ
SRC/slarfb_gett.f
SYNOPSIS ๐ฆ
FUNCTIONS/SUBROUTINES โจ
subroutine slarfb_gett (ident, m, n, k, t, ldt, a, lda, b, ldb, work, ldwork)
SLARFB_GETT
FUNCTION/SUBROUTINE DOCUMENTATION ๐
slarfb_gett ๐
subroutine slarfb_gett (character ident, integer m, integer n, integer k, real, dimension( ldt, * ) t, integer ldt, real, dimension( lda, * ) a, integer lda, real, dimension( ldb, * ) b, integer ldb, real, dimension( ldwork, * ) work, integer ldwork)
SLARFB_GETT
PURPOSE ๐
SLARFB_GETT applies a real Householder block reflector H from the left to a real (K+M)-by-N matrix composed of two block matrices: an upper trapezoidal K-by-N matrix A stored in the array A, and a rectangular M-by-(N-K) matrix B, stored in the array B. The block reflector H is stored in a compact WY-representation, where the elementary reflectors are in the arrays A, B and T. See Further Details section.
PARAMETERS ๐ง
IDENTโCHARACTER*1. The source literally saysIDENT = not 'I', or not 'i'โ so for anything that isn't'I'/'i',V1is unit lower-triangular and stored in the left K-by-K block of the input matrixA. IfIDENTis'I'or'i', thenV1is an identity matrix and not stored. See Further Details section.MโINTEGER. The number of rows of the matrixB.M >= 0.NโINTEGER. The number of columns of the matricesAandB.N >= 0.KโINTEGER. The number or rows of the matrixA.Kis also order of the matrixT, i.e. the number of elementary reflectors whose product defines the block reflector.0 <= K <= N.TโREALarray, dimension(LDT,K). The upper-triangular K-by-K matrixTin the representation of the block reflector.LDTโINTEGER. The leading dimension of the arrayT.LDT >= K.AโREALarray, dimension(LDA,N). On entry: a) In the K-by-N upper-trapezoidal partA: input matrixA. b) In the columns below the diagonal: columns ofV1(ones are not stored on the diagonal). On exit:Ais overwritten by rectangular K-by-N productH*A. See Further Details section.LDAโ the source saysLDB is INTEGERright here (not a typo from me, bestie โ keeping it exactly). The leading dimension of the arrayA.LDA >= max(1,K).BโREALarray, dimension(LDB,N). On entry: a) In the M-by-(N-K) right block: input matrixB. b) In the M-by-N left block: columns ofV2. On exit:Bis overwritten by rectangular M-by-N productH*B. See Further Details section.LDBโINTEGER. The leading dimension of the arrayB.LDB >= max(1,M).WORKโREALarray, dimension(LDWORK,max(K,N-K)).LDWORKโINTEGER. The leading dimension of the arrayWORK.LDWORK>=max(1,K).
AUTHOR ๐
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
CONTRIBUTORS: ๐
- November 2020, Igor Kozachenko, Computer Science Division, University of California, Berkeley
FURTHER DETAILS: ๐
โจ Detailed Description โจ
๐ (1) Description of the Algebraic Operation ๐
Okay bestie, hereโs the math tea โ. The matrix A is a K-by-N matrix made of two column block matrices: A1, which is K-by-K, and A2, which is K-by-(N-K):
A = ( A1, A2 ).
The matrix B is an M-by-N matrix made of two column block matrices: B1, which is M-by-K, and B2, which is M-by-(N-K):
B = ( B1, B2 ).
Then we perform the operation:
( A_out ) := H * ( A_in ) = ( I - V * T * V**T ) * ( A_in ) =
( B_out ) ( B_in ) ( B_in )
= ( I - ( V1 ) * T * ( V1**T, V2**T ) ) * ( A_in )
( V2 ) ( B_in )
On input, bestie:
a) ( A_in ) consists of two block columns:
( B_in )
( A_in ) = (( A1_in ) ( A2_in )) = (( A1_in ) ( A2_in ))
( B_in ) (( B1_in ) ( B2_in )) (( 0 ) ( B2_in )),
where the column blocks are:
( A1_in )is aK-by-Kupper-triangular matrix stored in the upper triangular part of the arrayA(1:K,1:K).( B1_in )is anM-by-Krectangular ZERO matrix and not stored.( A2_in )is aK-by-(N-K)rectangular matrix stored in the arrayA(1:K,K+1:N).( B2_in )is anM-by-(N-K)rectangular matrix stored in the arrayB(1:M,K+1:N).
Then:
b) V = ( V1 )
( V2 )
where:
- if
IDENT == 'I',V1is aK-by-Kidentity matrix, not stored; - if
IDENT != 'I',V1is aK-by-Kunit lower-triangular matrix, stored in the lower-triangular part of the arrayA(1:K,1:K)(ones are not stored),
and V2 is an M-by-K rectangular stored the array B(1:M,1:K), (because on input B1_in is a rectangular zero matrix that is not stored and the space is used to store V2). Periodt. ๐
Also:
c) T is a K-by-K upper-triangular matrix stored
in the array T(1:K,1:K).
On output:
a) ( A_out ) consists of two block columns:
( B_out )
( A_out ) = (( A1_out ) ( A2_out ))
( B_out ) (( B1_out ) ( B2_out )),
where the column blocks are:
( A1_out )is aK-by-Ksquare matrix, or aK-by-Kupper-triangular matrix, ifV1is an identity matrix.AiOutis stored in the arrayA(1:K,1:K).( B1_out )is anM-by-Krectangular matrix stored in the arrayB(1:M,K:N).( A2_out )is aK-by-(N-K)rectangular matrix stored in the arrayA(1:K,K+1:N).( B2_out )is anM-by-(N-K)rectangular matrix stored in the arrayB(1:M,K+1:N).
The operation above can be represented as the same operation on each block column:
( A1_out ) := H * ( A1_in ) = ( I - V * T * V**T ) * ( A1_in )
( B1_out ) ( 0 ) ( 0 )
( A2_out ) := H * ( A2_in ) = ( I - V * T * V**T ) * ( A2_in )
( B2_out ) ( B2_in ) ( B2_in )
If IDENT != 'I':
The computation for column block 1:
A1_out: = A1_in - V1*T*(V1**T)*A1_in
B1_out: = - V2*T*(V1**T)*A1_in
The computation for column block 2, which exists if N > K:
A2_out: = A2_in - V1*T*( (V1**T)*A2_in + (V2**T)*B2_in )
B2_out: = B2_in - V2*T*( (V1**T)*A2_in + (V2**T)*B2_in )
If IDENT == 'I':
The operation for column block 1:
A1_out: = A1_in - V1*T**A1_in
B1_out: = - V2*T**A1_in
The computation for column block 2, which exists if N > K:
A2_out: = A2_in - T*( A2_in + (V2**T)*B2_in )
B2_out: = B2_in - V2*T*( A2_in + (V2**T)*B2_in )
๐งฎ (2) Description of the Algorithmic Computation ๐งฎ
In the first step, we compute column block 2, i.e. A2 and B2. Here, we need to use the K-by-(N-K) rectangular workspace matrix W2 that is of the same size as the matrix A2. W2 is stored in the array WORK(1:K,1:(N-K)).
In the second step, we compute column block 1, i.e. A1 and B1. Here, we need to use the K-by-K square workspace matrix W1 that is of the same size as the as the matrix A1. W1 is stored in the array WORK(1:K,1:K).
NOTE: Hence, in this routine, we need the workspace arrayWORKonly of sizeWORK(1:K,1:max(K,N-K))so it can hold bothW2from the first step andW1from the second step.
Case (A), when V1 is unit lower-triangular, i.e. IDENT != 'I', more computations than in the Case (B).
if( IDENT != 'I' ) then
if ( N > K ) then
(First Step - column block 2)
col2_(1) W2: = A2
col2_(2) W2: = (V1**T) * W2 = (unit_lower_tr_of_(A1)**T) * W2
col2_(3) W2: = W2 + (V2**T) * B2 = W2 + (B1**T) * B2
col2_(4) W2: = T * W2
col2_(5) B2: = B2 - V2 * W2 = B2 - B1 * W2
col2_(6) W2: = V1 * W2 = unit_lower_tr_of_(A1) * W2
col2_(7) A2: = A2 - W2
else
(Second Step - column block 1)
col1_(1) W1: = A1
col1_(2) W1: = (V1**T) * W1 = (unit_lower_tr_of_(A1)**T) * W1
col1_(3) W1: = T * W1
col1_(4) B1: = - V2 * W1 = - B1 * W1
col1_(5) square W1: = V1 * W1 = unit_lower_tr_of_(A1) * W1
col1_(6) square A1: = A1 - W1
end if
end if
Case (B), when V1 is an identity matrix, i.e. IDENT == 'I', less computations than in the Case (A)
if( IDENT == 'I' ) then
if ( N > K ) then
(First Step - column block 2)
col2_(1) W2: = A2
col2_(3) W2: = W2 + (V2**T) * B2 = W2 + (B1**T) * B2
col2_(4) W2: = T * W2
col2_(5) B2: = B2 - V2 * W2 = B2 - B1 * W2
col2_(7) A2: = A2 - W2
else
(Second Step - column block 1)
col1_(1) W1: = A1
col1_(3) W1: = T * W1
col1_(4) B1: = - V2 * W1 = - B1 * W1
col1_(6) upper-triangular_of_(A1): = A1 - W1
end if
end if
Combine these cases (A) and (B) together, this is the resulting algorithm:
if ( N > K ) then
(First Step - column block 2)
col2_(1) W2: = A2
if( IDENT != 'I' ) then
col2_(2) W2: = (V1**T) * W2
= (unit_lower_tr_of_(A1)**T) * W2
end if
col2_(3) W2: = W2 + (V2**T) * B2 = W2 + (B1**T) * B2]
col2_(4) W2: = T * W2
col2_(5) B2: = B2 - V2 * W2 = B2 - B1 * W2
if( IDENT != 'I' ) then
col2_(6) W2: = V1 * W2 = unit_lower_tr_of_(A1) * W2
end if
col2_(7) A2: = A2 - W2
else
(Second Step - column block 1)
col1_(1) W1: = A1
if( IDENT != 'I' ) then
col1_(2) W1: = (V1**T) * W1
= (unit_lower_tr_of_(A1)**T) * W1
end if
col1_(3) W1: = T * W1
col1_(4) B1: = - V2 * W1 = - B1 * W1
if( IDENT != 'I' ) then
col1_(5) square W1: = V1 * W1 = unit_lower_tr_of_(A1) * W1
col1_(6_a) below_diag_of_(A1): = - below_diag_of_(W1)
end if
col1_(6_b) up_tr_of_(A1): = up_tr_of_(A1) - up_tr_of_(W1)
end if
๐ Definition at line 390 of file slarfb_gett.f.
๐ Author ๐
This icon was generated automatically by Doxygen for LAPACK from the source code. ๐ โจ
Thatโs the whole page, bestie! LAPACK Version 3.12.0, straight from SRC/slarfb_gett.f(3) โ slay and goodbye! ๐ซถ๐๐
๐ฆ where this page comes from
- arch rolling: lapack-doc 3.12.1-2 ยท custom
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms