*> \brief \b CLATRZ factors an upper trapezoidal matrix by means of unitary transformations.
*
* =========== DOCUMENTATION ===========
*
* Online html documentation available at
* http://www.netlib.org/lapack/explore-html/
*
*> \htmlonly
*> Download CLATRZ + dependencies
*>
*> [TGZ]
*>
*> [ZIP]
*>
*> [TXT]
*> \endhtmlonly
*
* Definition:
* ===========
*
* SUBROUTINE CLATRZ( M, N, L, A, LDA, TAU, WORK )
*
* .. Scalar Arguments ..
* INTEGER L, LDA, M, N
* ..
* .. Array Arguments ..
* COMPLEX A( LDA, * ), TAU( * ), WORK( * )
* ..
*
*
*> \par Purpose:
* =============
*>
*> \verbatim
*>
*> CLATRZ factors the M-by-(M+L) complex upper trapezoidal matrix
*> [ A1 A2 ] = [ A(1:M,1:M) A(1:M,N-L+1:N) ] as ( R 0 ) * Z by means
*> of unitary transformations, where Z is an (M+L)-by-(M+L) unitary
*> matrix and, R and A1 are M-by-M upper triangular matrices.
*> \endverbatim
*
* Arguments:
* ==========
*
*> \param[in] M
*> \verbatim
*> M is INTEGER
*> The number of rows of the matrix A. M >= 0.
*> \endverbatim
*>
*> \param[in] N
*> \verbatim
*> N is INTEGER
*> The number of columns of the matrix A. N >= 0.
*> \endverbatim
*>
*> \param[in] L
*> \verbatim
*> L is INTEGER
*> The number of columns of the matrix A containing the
*> meaningful part of the Householder vectors. N-M >= L >= 0.
*> \endverbatim
*>
*> \param[in,out] A
*> \verbatim
*> A is COMPLEX array, dimension (LDA,N)
*> On entry, the leading M-by-N upper trapezoidal part of the
*> array A must contain the matrix to be factorized.
*> On exit, the leading M-by-M upper triangular part of A
*> contains the upper triangular matrix R, and elements N-L+1 to
*> N of the first M rows of A, with the array TAU, represent the
*> unitary matrix Z as a product of M elementary reflectors.
*> \endverbatim
*>
*> \param[in] LDA
*> \verbatim
*> LDA is INTEGER
*> The leading dimension of the array A. LDA >= max(1,M).
*> \endverbatim
*>
*> \param[out] TAU
*> \verbatim
*> TAU is COMPLEX array, dimension (M)
*> The scalar factors of the elementary reflectors.
*> \endverbatim
*>
*> \param[out] WORK
*> \verbatim
*> WORK is COMPLEX array, dimension (M)
*> \endverbatim
*
* Authors:
* ========
*
*> \author Univ. of Tennessee
*> \author Univ. of California Berkeley
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
*> \date December 2016
*
*> \ingroup complexOTHERcomputational
*
*> \par Contributors:
* ==================
*>
*> A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA
*
*> \par Further Details:
* =====================
*>
*> \verbatim
*>
*> The factorization is obtained by Householder's method. The kth
*> transformation matrix, Z( k ), which is used to introduce zeros into
*> the ( m - k + 1 )th row of A, is given in the form
*>
*> Z( k ) = ( I 0 ),
*> ( 0 T( k ) )
*>
*> where
*>
*> T( k ) = I - tau*u( k )*u( k )**H, u( k ) = ( 1 ),
*> ( 0 )
*> ( z( k ) )
*>
*> tau is a scalar and z( k ) is an l element vector. tau and z( k )
*> are chosen to annihilate the elements of the kth row of A2.
*>
*> The scalar tau is returned in the kth element of TAU and the vector
*> u( k ) in the kth row of A2, such that the elements of z( k ) are
*> in a( k, l + 1 ), ..., a( k, n ). The elements of R are returned in
*> the upper triangular part of A1.
*>
*> Z is given by
*>
*> Z = Z( 1 ) * Z( 2 ) * ... * Z( m ).
*> \endverbatim
*>
* =====================================================================
SUBROUTINE CLATRZ( M, N, L, A, LDA, TAU, WORK )
*
* -- LAPACK computational routine (version 3.7.0) --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
* December 2016
*
* .. Scalar Arguments ..
INTEGER L, LDA, M, N
* ..
* .. Array Arguments ..
COMPLEX A( LDA, * ), TAU( * ), WORK( * )
* ..
*
* =====================================================================
*
* .. Parameters ..
COMPLEX ZERO
PARAMETER ( ZERO = ( 0.0E+0, 0.0E+0 ) )
* ..
* .. Local Scalars ..
INTEGER I
COMPLEX ALPHA
* ..
* .. External Subroutines ..
EXTERNAL CLACGV, CLARFG, CLARZ
* ..
* .. Intrinsic Functions ..
INTRINSIC CONJG
* ..
* .. Executable Statements ..
*
* Quick return if possible
*
IF( M.EQ.0 ) THEN
RETURN
ELSE IF( M.EQ.N ) THEN
DO 10 I = 1, N
TAU( I ) = ZERO
10 CONTINUE
RETURN
END IF
*
DO 20 I = M, 1, -1
*
* Generate elementary reflector H(i) to annihilate
* [ A(i,i) A(i,n-l+1:n) ]
*
CALL CLACGV( L, A( I, N-L+1 ), LDA )
ALPHA = CONJG( A( I, I ) )
CALL CLARFG( L+1, ALPHA, A( I, N-L+1 ), LDA, TAU( I ) )
TAU( I ) = CONJG( TAU( I ) )
*
* Apply H(i) to A(1:i-1,i:n) from the right
*
CALL CLARZ( 'Right', I-1, N-I+1, L, A( I, N-L+1 ), LDA,
$ CONJG( TAU( I ) ), A( 1, I ), LDA, WORK )
A( I, I ) = CONJG( ALPHA )
*
20 CONTINUE
*
RETURN
*
* End of CLATRZ
*
END