version 1.2, 2010/12/21 13:53:39
|
version 1.9, 2014/01/27 09:28:29
|
Line 1
|
Line 1
|
|
*> \brief \b DSYTRI2 |
|
* |
|
* =========== DOCUMENTATION =========== |
|
* |
|
* Online html documentation available at |
|
* http://www.netlib.org/lapack/explore-html/ |
|
* |
|
*> \htmlonly |
|
*> Download DSYTRI2 + dependencies |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dsytri2.f"> |
|
*> [TGZ]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dsytri2.f"> |
|
*> [ZIP]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dsytri2.f"> |
|
*> [TXT]</a> |
|
*> \endhtmlonly |
|
* |
|
* Definition: |
|
* =========== |
|
* |
|
* SUBROUTINE DSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO ) |
|
* |
|
* .. Scalar Arguments .. |
|
* CHARACTER UPLO |
|
* INTEGER INFO, LDA, LWORK, N |
|
* .. |
|
* .. Array Arguments .. |
|
* INTEGER IPIV( * ) |
|
* DOUBLE PRECISION A( LDA, * ), WORK( * ) |
|
* .. |
|
* |
|
* |
|
*> \par Purpose: |
|
* ============= |
|
*> |
|
*> \verbatim |
|
*> |
|
*> DSYTRI2 computes the inverse of a DOUBLE PRECISION symmetric indefinite matrix |
|
*> A using the factorization A = U*D*U**T or A = L*D*L**T computed by |
|
*> DSYTRF. DSYTRI2 sets the LEADING DIMENSION of the workspace |
|
*> before calling DSYTRI2X that actually computes the inverse. |
|
*> \endverbatim |
|
* |
|
* Arguments: |
|
* ========== |
|
* |
|
*> \param[in] UPLO |
|
*> \verbatim |
|
*> UPLO is CHARACTER*1 |
|
*> Specifies whether the details of the factorization are stored |
|
*> as an upper or lower triangular matrix. |
|
*> = 'U': Upper triangular, form is A = U*D*U**T; |
|
*> = 'L': Lower triangular, form is A = L*D*L**T. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] N |
|
*> \verbatim |
|
*> N is INTEGER |
|
*> The order of the matrix A. N >= 0. |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] A |
|
*> \verbatim |
|
*> A is DOUBLE PRECISION array, dimension (LDA,N) |
|
*> On entry, the NB diagonal matrix D and the multipliers |
|
*> used to obtain the factor U or L as computed by DSYTRF. |
|
*> |
|
*> On exit, if INFO = 0, the (symmetric) inverse of the original |
|
*> matrix. If UPLO = 'U', the upper triangular part of the |
|
*> inverse is formed and the part of A below the diagonal is not |
|
*> referenced; if UPLO = 'L' the lower triangular part of the |
|
*> inverse is formed and the part of A above the diagonal is |
|
*> not referenced. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDA |
|
*> \verbatim |
|
*> LDA is INTEGER |
|
*> The leading dimension of the array A. LDA >= max(1,N). |
|
*> \endverbatim |
|
*> |
|
*> \param[in] IPIV |
|
*> \verbatim |
|
*> IPIV is INTEGER array, dimension (N) |
|
*> Details of the interchanges and the NB structure of D |
|
*> as determined by DSYTRF. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] WORK |
|
*> \verbatim |
|
*> WORK is DOUBLE PRECISION array, dimension (N+NB+1)*(NB+3) |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LWORK |
|
*> \verbatim |
|
*> LWORK is INTEGER |
|
*> The dimension of the array WORK. |
|
*> WORK is size >= (N+NB+1)*(NB+3) |
|
*> If LDWORK = -1, then a workspace query is assumed; the routine |
|
*> calculates: |
|
*> - the optimal size of the WORK array, returns |
|
*> this value as the first entry of the WORK array, |
|
*> - and no error message related to LDWORK is issued by XERBLA. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] INFO |
|
*> \verbatim |
|
*> INFO is INTEGER |
|
*> = 0: successful exit |
|
*> < 0: if INFO = -i, the i-th argument had an illegal value |
|
*> > 0: if INFO = i, D(i,i) = 0; the matrix is singular and its |
|
*> inverse could not be computed. |
|
*> \endverbatim |
|
* |
|
* Authors: |
|
* ======== |
|
* |
|
*> \author Univ. of Tennessee |
|
*> \author Univ. of California Berkeley |
|
*> \author Univ. of Colorado Denver |
|
*> \author NAG Ltd. |
|
* |
|
*> \date September 2012 |
|
* |
|
*> \ingroup doubleSYcomputational |
|
* |
|
* ===================================================================== |
SUBROUTINE DSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO ) |
SUBROUTINE DSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO ) |
* |
* |
* -- LAPACK routine (version 3.3.0) -- |
* -- 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 2010 |
* September 2012 |
* |
|
* -- Written by Julie Langou of the Univ. of TN -- |
|
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
CHARACTER UPLO |
CHARACTER UPLO |
Line 16
|
Line 141
|
DOUBLE PRECISION A( LDA, * ), WORK( * ) |
DOUBLE PRECISION A( LDA, * ), WORK( * ) |
* .. |
* .. |
* |
* |
* Purpose |
|
* ======= |
|
* |
|
* DSYTRI2 computes the inverse of a real symmetric indefinite matrix |
|
* A using the factorization A = U*D*U**T or A = L*D*L**T computed by |
|
* DSYTRF. DSYTRI2 sets the LEADING DIMENSION of the workspace |
|
* before calling DSYTRI2X that actually computes the inverse. |
|
* |
|
* Arguments |
|
* ========= |
|
* |
|
* UPLO (input) CHARACTER*1 |
|
* Specifies whether the details of the factorization are stored |
|
* as an upper or lower triangular matrix. |
|
* = 'U': Upper triangular, form is A = U*D*U**T; |
|
* = 'L': Lower triangular, form is A = L*D*L**T. |
|
* |
|
* N (input) INTEGER |
|
* The order of the matrix A. N >= 0. |
|
* |
|
* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) |
|
* On entry, the NB diagonal matrix D and the multipliers |
|
* used to obtain the factor U or L as computed by DSYTRF. |
|
* |
|
* On exit, if INFO = 0, the (symmetric) inverse of the original |
|
* matrix. If UPLO = 'U', the upper triangular part of the |
|
* inverse is formed and the part of A below the diagonal is not |
|
* referenced; if UPLO = 'L' the lower triangular part of the |
|
* inverse is formed and the part of A above the diagonal is |
|
* not referenced. |
|
* |
|
* LDA (input) INTEGER |
|
* The leading dimension of the array A. LDA >= max(1,N). |
|
* |
|
* IPIV (input) INTEGER array, dimension (N) |
|
* Details of the interchanges and the NB structure of D |
|
* as determined by DSYTRF. |
|
* |
|
* WORK (workspace) DOUBLE PRECISION array, dimension (N+NB+1)*(NB+3) |
|
* |
|
* LWORK (input) INTEGER |
|
* The dimension of the array WORK. |
|
* WORK is size >= (N+NB+1)*(NB+3) |
|
* If LDWORK = -1, then a workspace query is assumed; the routine |
|
* calculates: |
|
* - the optimal size of the WORK array, returns |
|
* this value as the first entry of the WORK array, |
|
* - and no error message related to LDWORK is issued by XERBLA. |
|
* |
|
* INFO (output) INTEGER |
|
* = 0: successful exit |
|
* < 0: if INFO = -i, the i-th argument had an illegal value |
|
* > 0: if INFO = i, D(i,i) = 0; the matrix is singular and its |
|
* inverse could not be computed. |
|
* |
|
* ===================================================================== |
* ===================================================================== |
* |
* |
* .. Local Scalars .. |
* .. Local Scalars .. |
Line 94
|
Line 164
|
LQUERY = ( LWORK.EQ.-1 ) |
LQUERY = ( LWORK.EQ.-1 ) |
* Get blocksize |
* Get blocksize |
NBMAX = ILAENV( 1, 'DSYTRF', UPLO, N, -1, -1, -1 ) |
NBMAX = ILAENV( 1, 'DSYTRF', UPLO, N, -1, -1, -1 ) |
MINSIZE = (N+NBMAX+1)*(NBMAX+3) |
IF ( NBMAX .GE. N ) THEN |
|
MINSIZE = N |
|
ELSE |
|
MINSIZE = (N+NBMAX+1)*(NBMAX+3) |
|
END IF |
* |
* |
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN |
IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN |
INFO = -1 |
INFO = -1 |
Line 113
|
Line 187
|
CALL XERBLA( 'DSYTRI2', -INFO ) |
CALL XERBLA( 'DSYTRI2', -INFO ) |
RETURN |
RETURN |
ELSE IF( LQUERY ) THEN |
ELSE IF( LQUERY ) THEN |
WORK(1)=(N+NBMAX+1)*(NBMAX+3) |
WORK(1)=MINSIZE |
RETURN |
RETURN |
END IF |
END IF |
IF( N.EQ.0 ) |
IF( N.EQ.0 ) |
$ RETURN |
$ RETURN |
|
|
CALL DSYTRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO ) |
IF( NBMAX .GE. N ) THEN |
|
CALL DSYTRI( UPLO, N, A, LDA, IPIV, WORK, INFO ) |
|
ELSE |
|
CALL DSYTRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO ) |
|
END IF |
RETURN |
RETURN |
* |
* |
* End of DSYTRI2 |
* End of DSYTRI2 |