version 1.4, 2010/08/06 15:32:43
|
version 1.13, 2012/12/14 14:22:50
|
Line 1
|
Line 1
|
|
*> \brief \b ZLAHEF computes a partial factorization of a complex Hermitian indefinite matrix, using the diagonal pivoting method. |
|
* |
|
* =========== DOCUMENTATION =========== |
|
* |
|
* Online html documentation available at |
|
* http://www.netlib.org/lapack/explore-html/ |
|
* |
|
*> \htmlonly |
|
*> Download ZLAHEF + dependencies |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlahef.f"> |
|
*> [TGZ]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlahef.f"> |
|
*> [ZIP]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlahef.f"> |
|
*> [TXT]</a> |
|
*> \endhtmlonly |
|
* |
|
* Definition: |
|
* =========== |
|
* |
|
* SUBROUTINE ZLAHEF( UPLO, N, NB, KB, A, LDA, IPIV, W, LDW, INFO ) |
|
* |
|
* .. Scalar Arguments .. |
|
* CHARACTER UPLO |
|
* INTEGER INFO, KB, LDA, LDW, N, NB |
|
* .. |
|
* .. Array Arguments .. |
|
* INTEGER IPIV( * ) |
|
* COMPLEX*16 A( LDA, * ), W( LDW, * ) |
|
* .. |
|
* |
|
* |
|
*> \par Purpose: |
|
* ============= |
|
*> |
|
*> \verbatim |
|
*> |
|
*> ZLAHEF computes a partial factorization of a complex Hermitian |
|
*> matrix A using the Bunch-Kaufman diagonal pivoting method. The |
|
*> partial factorization has the form: |
|
*> |
|
*> A = ( I U12 ) ( A11 0 ) ( I 0 ) if UPLO = 'U', or: |
|
*> ( 0 U22 ) ( 0 D ) ( U12**H U22**H ) |
|
*> |
|
*> A = ( L11 0 ) ( D 0 ) ( L11**H L21**H ) if UPLO = 'L' |
|
*> ( L21 I ) ( 0 A22 ) ( 0 I ) |
|
*> |
|
*> where the order of D is at most NB. The actual order is returned in |
|
*> the argument KB, and is either NB or NB-1, or N if N <= NB. |
|
*> Note that U**H denotes the conjugate transpose of U. |
|
*> |
|
*> ZLAHEF is an auxiliary routine called by ZHETRF. It uses blocked code |
|
*> (calling Level 3 BLAS) to update the submatrix A11 (if UPLO = 'U') or |
|
*> A22 (if UPLO = 'L'). |
|
*> \endverbatim |
|
* |
|
* Arguments: |
|
* ========== |
|
* |
|
*> \param[in] UPLO |
|
*> \verbatim |
|
*> UPLO is CHARACTER*1 |
|
*> Specifies whether the upper or lower triangular part of the |
|
*> Hermitian matrix A is stored: |
|
*> = 'U': Upper triangular |
|
*> = 'L': Lower triangular |
|
*> \endverbatim |
|
*> |
|
*> \param[in] N |
|
*> \verbatim |
|
*> N is INTEGER |
|
*> The order of the matrix A. N >= 0. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] NB |
|
*> \verbatim |
|
*> NB is INTEGER |
|
*> The maximum number of columns of the matrix A that should be |
|
*> factored. NB should be at least 2 to allow for 2-by-2 pivot |
|
*> blocks. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] KB |
|
*> \verbatim |
|
*> KB is INTEGER |
|
*> The number of columns of A that were actually factored. |
|
*> KB is either NB-1 or NB, or N if N <= NB. |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] A |
|
*> \verbatim |
|
*> A is COMPLEX*16 array, dimension (LDA,N) |
|
*> On entry, the Hermitian matrix A. If UPLO = 'U', the leading |
|
*> n-by-n upper triangular part of A contains the upper |
|
*> triangular part of the matrix A, and the strictly lower |
|
*> triangular part of A is not referenced. If UPLO = 'L', the |
|
*> leading n-by-n lower triangular part of A contains the lower |
|
*> triangular part of the matrix A, and the strictly upper |
|
*> triangular part of A is not referenced. |
|
*> On exit, A contains details of the partial factorization. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDA |
|
*> \verbatim |
|
*> LDA is INTEGER |
|
*> The leading dimension of the array A. LDA >= max(1,N). |
|
*> \endverbatim |
|
*> |
|
*> \param[out] IPIV |
|
*> \verbatim |
|
*> IPIV is INTEGER array, dimension (N) |
|
*> Details of the interchanges and the block structure of D. |
|
*> If UPLO = 'U', only the last KB elements of IPIV are set; |
|
*> if UPLO = 'L', only the first KB elements are set. |
|
*> |
|
*> If IPIV(k) > 0, then rows and columns k and IPIV(k) were |
|
*> interchanged and D(k,k) is a 1-by-1 diagonal block. |
|
*> If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and |
|
*> columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) |
|
*> is a 2-by-2 diagonal block. If UPLO = 'L' and IPIV(k) = |
|
*> IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were |
|
*> interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] W |
|
*> \verbatim |
|
*> W is COMPLEX*16 array, dimension (LDW,NB) |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDW |
|
*> \verbatim |
|
*> LDW is INTEGER |
|
*> The leading dimension of the array W. LDW >= max(1,N). |
|
*> \endverbatim |
|
*> |
|
*> \param[out] INFO |
|
*> \verbatim |
|
*> INFO is INTEGER |
|
*> = 0: successful exit |
|
*> > 0: if INFO = k, D(k,k) is exactly zero. The factorization |
|
*> has been completed, but the block diagonal matrix D is |
|
*> exactly singular. |
|
*> \endverbatim |
|
* |
|
* Authors: |
|
* ======== |
|
* |
|
*> \author Univ. of Tennessee |
|
*> \author Univ. of California Berkeley |
|
*> \author Univ. of Colorado Denver |
|
*> \author NAG Ltd. |
|
* |
|
*> \date September 2012 |
|
* |
|
*> \ingroup complex16HEcomputational |
|
* |
|
* ===================================================================== |
SUBROUTINE ZLAHEF( UPLO, N, NB, KB, A, LDA, IPIV, W, LDW, INFO ) |
SUBROUTINE ZLAHEF( UPLO, N, NB, KB, A, LDA, IPIV, W, LDW, INFO ) |
* |
* |
* -- LAPACK routine (version 3.2) -- |
* -- LAPACK computational routine (version 3.4.2) -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* November 2006 |
* September 2012 |
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
CHARACTER UPLO |
CHARACTER UPLO |
Line 14
|
Line 171
|
COMPLEX*16 A( LDA, * ), W( LDW, * ) |
COMPLEX*16 A( LDA, * ), W( LDW, * ) |
* .. |
* .. |
* |
* |
* Purpose |
|
* ======= |
|
* |
|
* ZLAHEF computes a partial factorization of a complex Hermitian |
|
* matrix A using the Bunch-Kaufman diagonal pivoting method. The |
|
* partial factorization has the form: |
|
* |
|
* A = ( I U12 ) ( A11 0 ) ( I 0 ) if UPLO = 'U', or: |
|
* ( 0 U22 ) ( 0 D ) ( U12' U22' ) |
|
* |
|
* A = ( L11 0 ) ( D 0 ) ( L11' L21' ) if UPLO = 'L' |
|
* ( L21 I ) ( 0 A22 ) ( 0 I ) |
|
* |
|
* where the order of D is at most NB. The actual order is returned in |
|
* the argument KB, and is either NB or NB-1, or N if N <= NB. |
|
* Note that U' denotes the conjugate transpose of U. |
|
* |
|
* ZLAHEF is an auxiliary routine called by ZHETRF. It uses blocked code |
|
* (calling Level 3 BLAS) to update the submatrix A11 (if UPLO = 'U') or |
|
* A22 (if UPLO = 'L'). |
|
* |
|
* Arguments |
|
* ========= |
|
* |
|
* UPLO (input) CHARACTER*1 |
|
* Specifies whether the upper or lower triangular part of the |
|
* Hermitian matrix A is stored: |
|
* = 'U': Upper triangular |
|
* = 'L': Lower triangular |
|
* |
|
* N (input) INTEGER |
|
* The order of the matrix A. N >= 0. |
|
* |
|
* NB (input) INTEGER |
|
* The maximum number of columns of the matrix A that should be |
|
* factored. NB should be at least 2 to allow for 2-by-2 pivot |
|
* blocks. |
|
* |
|
* KB (output) INTEGER |
|
* The number of columns of A that were actually factored. |
|
* KB is either NB-1 or NB, or N if N <= NB. |
|
* |
|
* A (input/output) COMPLEX*16 array, dimension (LDA,N) |
|
* On entry, the Hermitian matrix A. If UPLO = 'U', the leading |
|
* n-by-n upper triangular part of A contains the upper |
|
* triangular part of the matrix A, and the strictly lower |
|
* triangular part of A is not referenced. If UPLO = 'L', the |
|
* leading n-by-n lower triangular part of A contains the lower |
|
* triangular part of the matrix A, and the strictly upper |
|
* triangular part of A is not referenced. |
|
* On exit, A contains details of the partial factorization. |
|
* |
|
* LDA (input) INTEGER |
|
* The leading dimension of the array A. LDA >= max(1,N). |
|
* |
|
* IPIV (output) INTEGER array, dimension (N) |
|
* Details of the interchanges and the block structure of D. |
|
* If UPLO = 'U', only the last KB elements of IPIV are set; |
|
* if UPLO = 'L', only the first KB elements are set. |
|
* |
|
* If IPIV(k) > 0, then rows and columns k and IPIV(k) were |
|
* interchanged and D(k,k) is a 1-by-1 diagonal block. |
|
* If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and |
|
* columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) |
|
* is a 2-by-2 diagonal block. If UPLO = 'L' and IPIV(k) = |
|
* IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were |
|
* interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. |
|
* |
|
* W (workspace) COMPLEX*16 array, dimension (LDW,NB) |
|
* |
|
* LDW (input) INTEGER |
|
* The leading dimension of the array W. LDW >= max(1,N). |
|
* |
|
* INFO (output) INTEGER |
|
* = 0: successful exit |
|
* > 0: if INFO = k, D(k,k) is exactly zero. The factorization |
|
* has been completed, but the block diagonal matrix D is |
|
* exactly singular. |
|
* |
|
* ===================================================================== |
* ===================================================================== |
* |
* |
* .. Parameters .. |
* .. Parameters .. |
Line 344
|
Line 422
|
* |
* |
* Update the upper triangle of A11 (= A(1:k,1:k)) as |
* Update the upper triangle of A11 (= A(1:k,1:k)) as |
* |
* |
* A11 := A11 - U12*D*U12' = A11 - U12*W' |
* A11 := A11 - U12*D*U12**H = A11 - U12*W**H |
* |
* |
* computing blocks of NB columns at a time (note that conjg(W) is |
* computing blocks of NB columns at a time (note that conjg(W) is |
* actually stored) |
* actually stored) |
Line 593
|
Line 671
|
* |
* |
* Update the lower triangle of A22 (= A(k:n,k:n)) as |
* Update the lower triangle of A22 (= A(k:n,k:n)) as |
* |
* |
* A22 := A22 - L21*D*L21' = A22 - L21*W' |
* A22 := A22 - L21*D*L21**H = A22 - L21*W**H |
* |
* |
* computing blocks of NB columns at a time (note that conjg(W) is |
* computing blocks of NB columns at a time (note that conjg(W) is |
* actually stored) |
* actually stored) |