clarzt - form the triangular factor T of a complex block reflector H of order > n, which is defined as a product of k elementary reflectors
SUBROUTINE CLARZT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT) CHARACTER * 1 DIRECT, STOREV COMPLEX V(LDV,*), TAU(*), T(LDT,*) INTEGER N, K, LDV, LDT
SUBROUTINE CLARZT_64( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT) CHARACTER * 1 DIRECT, STOREV COMPLEX V(LDV,*), TAU(*), T(LDT,*) INTEGER*8 N, K, LDV, LDT
SUBROUTINE LARZT( DIRECT, STOREV, N, K, V, [LDV], TAU, T, [LDT]) CHARACTER(LEN=1) :: DIRECT, STOREV COMPLEX, DIMENSION(:) :: TAU COMPLEX, DIMENSION(:,:) :: V, T INTEGER :: N, K, LDV, LDT
SUBROUTINE LARZT_64( DIRECT, STOREV, N, K, V, [LDV], TAU, T, [LDT]) CHARACTER(LEN=1) :: DIRECT, STOREV COMPLEX, DIMENSION(:) :: TAU COMPLEX, DIMENSION(:,:) :: V, T INTEGER(8) :: N, K, LDV, LDT
#include <sunperf.h>
void clarzt(char direct, char storev, int n, int k, complex *v, int ldv, complex *tau, complex *t, int ldt);
void clarzt_64(char direct, char storev, long n, long k, complex *v, long ldv, complex *tau, complex *t, long ldt);
clarzt forms the triangular factor T of a complex block reflector H of order > n, which is defined as a product of k elementary reflectors.
If DIRECT = 'F', H = H(1)
H(2)
. . . H(k)
and T is upper triangular;
If DIRECT = 'B', H = H(k)
. . . H(2)
H(1)
and T is lower triangular.
If STOREV = 'C', the vector which defines the elementary reflector
H(i)
is stored in the i-th column of the array V, and
H = I - V * T * V'
If STOREV = 'R', the vector which defines the elementary reflector
H(i)
is stored in the i-th row of the array V, and
H = I - V' * T * V
Currently, only STOREV = 'R' and DIRECT = 'B' are supported.
= 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet)
= 'B': H = H(k) . . . H(2) H(1) (Backward)
= 'R': rowwise
TAU(i)
must contain the scalar factor of the elementary
reflector H(i).
Based on contributions by
A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
The shape of the matrix V and the storage of the vectors which define
the H(i)
is best illustrated by the following example with n = 5 and
k = 3. The elements equal to 1 are not stored; the corresponding
array elements are modified but restored on exit. The rest of the
array is not used.
DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R':
______V_____
( v1 v2 v3 ) / \ ( v1 v2 v3 ) ( v1 v1 v1 v1 v1 . . . . 1 ) V = ( v1 v2 v3 ) ( v2 v2 v2 v2 v2 . . . 1 ) ( v1 v2 v3 ) ( v3 v3 v3 v3 v3 . . 1 ) ( v1 v2 v3 )
. . .
. . .
1 . .
1 .
1
DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R':
______V_____ 1 / \ . 1 ( 1 . . . . v1 v1 v1 v1 v1 ) . . 1 ( . 1 . . . v2 v2 v2 v2 v2 ) . . . ( . . 1 . . v3 v3 v3 v3 v3 ) . . .
( v1 v2 v3 )
( v1 v2 v3 )
V = ( v1 v2 v3 )
( v1 v2 v3 )
( v1 v2 v3 )