1*> \brief \b DSYTRI2 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8*> \htmlonly 9*> Download DSYTRI2 + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dsytri2.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dsytri2.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dsytri2.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE DSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO ) 22* 23* .. Scalar Arguments .. 24* CHARACTER UPLO 25* INTEGER INFO, LDA, LWORK, N 26* .. 27* .. Array Arguments .. 28* INTEGER IPIV( * ) 29* DOUBLE PRECISION A( LDA, * ), WORK( * ) 30* .. 31* 32* 33*> \par Purpose: 34* ============= 35*> 36*> \verbatim 37*> 38*> DSYTRI2 computes the inverse of a DOUBLE PRECISION symmetric indefinite matrix 39*> A using the factorization A = U*D*U**T or A = L*D*L**T computed by 40*> DSYTRF. DSYTRI2 sets the LEADING DIMENSION of the workspace 41*> before calling DSYTRI2X that actually computes the inverse. 42*> \endverbatim 43* 44* Arguments: 45* ========== 46* 47*> \param[in] UPLO 48*> \verbatim 49*> UPLO is CHARACTER*1 50*> Specifies whether the details of the factorization are stored 51*> as an upper or lower triangular matrix. 52*> = 'U': Upper triangular, form is A = U*D*U**T; 53*> = 'L': Lower triangular, form is A = L*D*L**T. 54*> \endverbatim 55*> 56*> \param[in] N 57*> \verbatim 58*> N is INTEGER 59*> The order of the matrix A. N >= 0. 60*> \endverbatim 61*> 62*> \param[in,out] A 63*> \verbatim 64*> A is DOUBLE PRECISION array, dimension (LDA,N) 65*> On entry, the block diagonal matrix D and the multipliers 66*> used to obtain the factor U or L as computed by DSYTRF. 67*> 68*> On exit, if INFO = 0, the (symmetric) inverse of the original 69*> matrix. If UPLO = 'U', the upper triangular part of the 70*> inverse is formed and the part of A below the diagonal is not 71*> referenced; if UPLO = 'L' the lower triangular part of the 72*> inverse is formed and the part of A above the diagonal is 73*> not referenced. 74*> \endverbatim 75*> 76*> \param[in] LDA 77*> \verbatim 78*> LDA is INTEGER 79*> The leading dimension of the array A. LDA >= max(1,N). 80*> \endverbatim 81*> 82*> \param[in] IPIV 83*> \verbatim 84*> IPIV is INTEGER array, dimension (N) 85*> Details of the interchanges and the block structure of D 86*> as determined by DSYTRF. 87*> \endverbatim 88*> 89*> \param[out] WORK 90*> \verbatim 91*> WORK is DOUBLE PRECISION array, dimension (N+NB+1)*(NB+3) 92*> \endverbatim 93*> 94*> \param[in] LWORK 95*> \verbatim 96*> LWORK is INTEGER 97*> The dimension of the array WORK. 98*> WORK is size >= (N+NB+1)*(NB+3) 99*> If LWORK = -1, then a workspace query is assumed; the routine 100*> calculates: 101*> - the optimal size of the WORK array, returns 102*> this value as the first entry of the WORK array, 103*> - and no error message related to LWORK is issued by XERBLA. 104*> \endverbatim 105*> 106*> \param[out] INFO 107*> \verbatim 108*> INFO is INTEGER 109*> = 0: successful exit 110*> < 0: if INFO = -i, the i-th argument had an illegal value 111*> > 0: if INFO = i, D(i,i) = 0; the matrix is singular and its 112*> inverse could not be computed. 113*> \endverbatim 114* 115* Authors: 116* ======== 117* 118*> \author Univ. of Tennessee 119*> \author Univ. of California Berkeley 120*> \author Univ. of Colorado Denver 121*> \author NAG Ltd. 122* 123*> \ingroup doubleSYcomputational 124* 125* ===================================================================== 126 SUBROUTINE DSYTRI2( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO ) 127* 128* -- LAPACK computational routine -- 129* -- LAPACK is a software package provided by Univ. of Tennessee, -- 130* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 131* 132* .. Scalar Arguments .. 133 CHARACTER UPLO 134 INTEGER INFO, LDA, LWORK, N 135* .. 136* .. Array Arguments .. 137 INTEGER IPIV( * ) 138 DOUBLE PRECISION A( LDA, * ), WORK( * ) 139* .. 140* 141* ===================================================================== 142* 143* .. Local Scalars .. 144 LOGICAL UPPER, LQUERY 145 INTEGER MINSIZE, NBMAX 146* .. 147* .. External Functions .. 148 LOGICAL LSAME 149 INTEGER ILAENV 150 EXTERNAL LSAME, ILAENV 151* .. 152* .. External Subroutines .. 153 EXTERNAL DSYTRI, DSYTRI2X, XERBLA 154* .. 155* .. Executable Statements .. 156* 157* Test the input parameters. 158* 159 INFO = 0 160 UPPER = LSAME( UPLO, 'U' ) 161 LQUERY = ( LWORK.EQ.-1 ) 162* Get blocksize 163 NBMAX = ILAENV( 1, 'DSYTRI2', UPLO, N, -1, -1, -1 ) 164 IF ( NBMAX .GE. N ) THEN 165 MINSIZE = N 166 ELSE 167 MINSIZE = (N+NBMAX+1)*(NBMAX+3) 168 END IF 169* 170 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN 171 INFO = -1 172 ELSE IF( N.LT.0 ) THEN 173 INFO = -2 174 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN 175 INFO = -4 176 ELSE IF (LWORK .LT. MINSIZE .AND. .NOT.LQUERY ) THEN 177 INFO = -7 178 END IF 179* 180* Quick return if possible 181* 182* 183 IF( INFO.NE.0 ) THEN 184 CALL XERBLA( 'DSYTRI2', -INFO ) 185 RETURN 186 ELSE IF( LQUERY ) THEN 187 WORK(1)=MINSIZE 188 RETURN 189 END IF 190 IF( N.EQ.0 ) 191 $ RETURN 192 193 IF( NBMAX .GE. N ) THEN 194 CALL DSYTRI( UPLO, N, A, LDA, IPIV, WORK, INFO ) 195 ELSE 196 CALL DSYTRI2X( UPLO, N, A, LDA, IPIV, WORK, NBMAX, INFO ) 197 END IF 198 RETURN 199* 200* End of DSYTRI2 201* 202 END 203