version 1.1, 2017/06/17 11:02:54
|
version 1.6, 2023/08/07 08:39:24
|
Line 42
|
Line 42
|
*> matrices. |
*> matrices. |
*> |
*> |
*> Aasen's algorithm is used to factor A as |
*> Aasen's algorithm is used to factor A as |
*> A = U * T * U**H, if UPLO = 'U', or |
*> A = U**H * T * U, if UPLO = 'U', or |
*> A = L * T * L**H, if UPLO = 'L', |
*> A = L * T * L**H, if UPLO = 'L', |
*> where U (or L) is a product of permutation and unit upper (lower) |
*> where U (or L) is a product of permutation and unit upper (lower) |
*> triangular matrices, and T is Hermitian and tridiagonal. The factored form |
*> triangular matrices, and T is Hermitian and tridiagonal. The factored form |
Line 86
|
Line 86
|
*> |
*> |
*> On exit, if INFO = 0, the tridiagonal matrix T and the |
*> On exit, if INFO = 0, the tridiagonal matrix T and the |
*> multipliers used to obtain the factor U or L from the |
*> multipliers used to obtain the factor U or L from the |
*> factorization A = U*T*U**H or A = L*T*L**H as computed by |
*> factorization A = U**H*T*U or A = L*T*L**H as computed by |
*> ZHETRF_AA. |
*> ZHETRF_AA. |
*> \endverbatim |
*> \endverbatim |
*> |
*> |
Line 129
|
Line 129
|
*> The length of WORK. LWORK >= MAX(1,2*N,3*N-2), and for best |
*> The length of WORK. LWORK >= MAX(1,2*N,3*N-2), and for best |
*> performance LWORK >= max(1,N*NB), where NB is the optimal |
*> performance LWORK >= max(1,N*NB), where NB is the optimal |
*> blocksize for ZHETRF. |
*> blocksize for ZHETRF. |
*> for LWORK < N, TRS will be done with Level BLAS 2 |
|
*> for LWORK >= N, TRS will be done with Level BLAS 3 |
|
*> |
*> |
*> If LWORK = -1, then a workspace query is assumed; the routine |
*> If LWORK = -1, then a workspace query is assumed; the routine |
*> only calculates the optimal size of the WORK array, returns |
*> only calculates the optimal size of the WORK array, returns |
Line 156
|
Line 154
|
*> \author Univ. of Colorado Denver |
*> \author Univ. of Colorado Denver |
*> \author NAG Ltd. |
*> \author NAG Ltd. |
* |
* |
*> \date December 2016 |
|
* |
|
*> \ingroup complex16HEsolve |
*> \ingroup complex16HEsolve |
* |
* |
* ===================================================================== |
* ===================================================================== |
SUBROUTINE ZHESV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK, |
SUBROUTINE ZHESV_AA( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK, |
$ LWORK, INFO ) |
$ LWORK, INFO ) |
* |
* |
* -- LAPACK driver routine (version 3.7.0) -- |
* -- LAPACK driver routine -- |
* -- 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..-- |
* December 2016 |
|
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
CHARACTER UPLO |
CHARACTER UPLO |
Line 190
|
Line 185
|
EXTERNAL LSAME, ILAENV |
EXTERNAL LSAME, ILAENV |
* .. |
* .. |
* .. External Subroutines .. |
* .. External Subroutines .. |
EXTERNAL XERBLA, ZHETRF, ZHETRS, ZHETRS2 |
EXTERNAL XERBLA, ZHETRF_AA, ZHETRS_AA |
* .. |
* .. |
* .. Intrinsic Functions .. |
* .. Intrinsic Functions .. |
INTRINSIC MAX |
INTRINSIC MAX |
Line 211
|
Line 206
|
INFO = -5 |
INFO = -5 |
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN |
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN |
INFO = -8 |
INFO = -8 |
|
ELSE IF( LWORK.LT.MAX(2*N, 3*N-2) .AND. .NOT.LQUERY ) THEN |
|
INFO = -10 |
END IF |
END IF |
* |
* |
IF( INFO.EQ.0 ) THEN |
IF( INFO.EQ.0 ) THEN |
Line 221
|
Line 218
|
LWKOPT_HETRS = INT( WORK(1) ) |
LWKOPT_HETRS = INT( WORK(1) ) |
LWKOPT = MAX( LWKOPT_HETRF, LWKOPT_HETRS ) |
LWKOPT = MAX( LWKOPT_HETRF, LWKOPT_HETRS ) |
WORK( 1 ) = LWKOPT |
WORK( 1 ) = LWKOPT |
IF( LWORK.LT.LWKOPT .AND. .NOT.LQUERY ) THEN |
|
INFO = -10 |
|
END IF |
|
END IF |
END IF |
* |
* |
IF( INFO.NE.0 ) THEN |
IF( INFO.NE.0 ) THEN |
Line 233
|
Line 227
|
RETURN |
RETURN |
END IF |
END IF |
* |
* |
* Compute the factorization A = U*T*U**H or A = L*T*L**H. |
* Compute the factorization A = U**H*T*U or A = L*T*L**H. |
* |
* |
CALL ZHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO ) |
CALL ZHETRF_AA( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO ) |
IF( INFO.EQ.0 ) THEN |
IF( INFO.EQ.0 ) THEN |