LAPACK  3.8.0
LAPACK: Linear Algebra PACKage

◆ dsycon_3()

subroutine dsycon_3 ( character  UPLO,
integer  N,
double precision, dimension( lda, * )  A,
integer  LDA,
double precision, dimension( * )  E,
integer, dimension( * )  IPIV,
double precision  ANORM,
double precision  RCOND,
double precision, dimension( * )  WORK,
integer, dimension( * )  IWORK,
integer  INFO 
)

DSYCON_3

Download DSYCON_3 + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 DSYCON_3 estimates the reciprocal of the condition number (in the
 1-norm) of a real symmetric matrix A using the factorization
 computed by DSYTRF_RK or DSYTRF_BK:

    A = P*U*D*(U**T)*(P**T) or A = P*L*D*(L**T)*(P**T),

 where U (or L) is unit upper (or lower) triangular matrix,
 U**T (or L**T) is the transpose of U (or L), P is a permutation
 matrix, P**T is the transpose of P, and D is symmetric and block
 diagonal with 1-by-1 and 2-by-2 diagonal blocks.

 An estimate is obtained for norm(inv(A)), and the reciprocal of the
 condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))).
 This routine uses BLAS3 solver DSYTRS_3.
Parameters
[in]UPLO
          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 = P*U*D*(U**T)*(P**T);
          = 'L':  Lower triangular, form is A = P*L*D*(L**T)*(P**T).
[in]N
          N is INTEGER
          The order of the matrix A.  N >= 0.
[in]A
          A is DOUBLE PRECISION array, dimension (LDA,N)
          Diagonal of the block diagonal matrix D and factors U or L
          as computed by DSYTRF_RK and DSYTRF_BK:
            a) ONLY diagonal elements of the symmetric block diagonal
               matrix D on the diagonal of A, i.e. D(k,k) = A(k,k);
               (superdiagonal (or subdiagonal) elements of D
                should be provided on entry in array E), and
            b) If UPLO = 'U': factor U in the superdiagonal part of A.
               If UPLO = 'L': factor L in the subdiagonal part of A.
[in]LDA
          LDA is INTEGER
          The leading dimension of the array A.  LDA >= max(1,N).
[in]E
          E is DOUBLE PRECISION array, dimension (N)
          On entry, contains the superdiagonal (or subdiagonal)
          elements of the symmetric block diagonal matrix D
          with 1-by-1 or 2-by-2 diagonal blocks, where
          If UPLO = 'U': E(i) = D(i-1,i),i=2:N, E(1) not referenced;
          If UPLO = 'L': E(i) = D(i+1,i),i=1:N-1, E(N) not referenced.

          NOTE: For 1-by-1 diagonal block D(k), where
          1 <= k <= N, the element E(k) is not referenced in both
          UPLO = 'U' or UPLO = 'L' cases.
[in]IPIV
          IPIV is INTEGER array, dimension (N)
          Details of the interchanges and the block structure of D
          as determined by DSYTRF_RK or DSYTRF_BK.
[in]ANORM
          ANORM is DOUBLE PRECISION
          The 1-norm of the original matrix A.
[out]RCOND
          RCOND is DOUBLE PRECISION
          The reciprocal of the condition number of the matrix A,
          computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an
          estimate of the 1-norm of inv(A) computed in this routine.
[out]WORK
          WORK is DOUBLE PRECISION array, dimension (2*N)
[out]IWORK
          IWORK is INTEGER array, dimension (N)
[out]INFO
          INFO is INTEGER
          = 0:  successful exit
          < 0:  if INFO = -i, the i-th argument had an illegal value
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Date
June 2017
Contributors:

June 2017, Igor Kozachenko, Computer Science Division, University of California, Berkeley

September 2007, Sven Hammarling, Nicholas J. Higham, Craig Lucas, School of Mathematics, University of Manchester

Definition at line 173 of file dsycon_3.f.

173 *
174 * -- LAPACK computational routine (version 3.7.1) --
175 * -- LAPACK is a software package provided by Univ. of Tennessee, --
176 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
177 * June 2017
178 *
179 * .. Scalar Arguments ..
180  CHARACTER uplo
181  INTEGER info, lda, n
182  DOUBLE PRECISION anorm, rcond
183 * ..
184 * .. Array Arguments ..
185  INTEGER ipiv( * ), iwork( * )
186  DOUBLE PRECISION a( lda, * ), e( * ), work( * )
187 * ..
188 *
189 * =====================================================================
190 *
191 * .. Parameters ..
192  DOUBLE PRECISION one, zero
193  parameter( one = 1.0d+0, zero = 0.0d+0 )
194 * ..
195 * .. Local Scalars ..
196  LOGICAL upper
197  INTEGER i, kase
198  DOUBLE PRECISION ainvnm
199 * ..
200 * .. Local Arrays ..
201  INTEGER isave( 3 )
202 * ..
203 * .. External Functions ..
204  LOGICAL lsame
205  EXTERNAL lsame
206 * ..
207 * .. External Subroutines ..
208  EXTERNAL dlacn2, dsytrs_3, xerbla
209 * ..
210 * .. Intrinsic Functions ..
211  INTRINSIC max
212 * ..
213 * .. Executable Statements ..
214 *
215 * Test the input parameters.
216 *
217  info = 0
218  upper = lsame( uplo, 'U' )
219  IF( .NOT.upper .AND. .NOT.lsame( uplo, 'L' ) ) THEN
220  info = -1
221  ELSE IF( n.LT.0 ) THEN
222  info = -2
223  ELSE IF( lda.LT.max( 1, n ) ) THEN
224  info = -4
225  ELSE IF( anorm.LT.zero ) THEN
226  info = -7
227  END IF
228  IF( info.NE.0 ) THEN
229  CALL xerbla( 'DSYCON_3', -info )
230  RETURN
231  END IF
232 *
233 * Quick return if possible
234 *
235  rcond = zero
236  IF( n.EQ.0 ) THEN
237  rcond = one
238  RETURN
239  ELSE IF( anorm.LE.zero ) THEN
240  RETURN
241  END IF
242 *
243 * Check that the diagonal matrix D is nonsingular.
244 *
245  IF( upper ) THEN
246 *
247 * Upper triangular storage: examine D from bottom to top
248 *
249  DO i = n, 1, -1
250  IF( ipiv( i ).GT.0 .AND. a( i, i ).EQ.zero )
251  $ RETURN
252  END DO
253  ELSE
254 *
255 * Lower triangular storage: examine D from top to bottom.
256 *
257  DO i = 1, n
258  IF( ipiv( i ).GT.0 .AND. a( i, i ).EQ.zero )
259  $ RETURN
260  END DO
261  END IF
262 *
263 * Estimate the 1-norm of the inverse.
264 *
265  kase = 0
266  30 CONTINUE
267  CALL dlacn2( n, work( n+1 ), work, iwork, ainvnm, kase, isave )
268  IF( kase.NE.0 ) THEN
269 *
270 * Multiply by inv(L*D*L**T) or inv(U*D*U**T).
271 *
272  CALL dsytrs_3( uplo, n, 1, a, lda, e, ipiv, work, n, info )
273  GO TO 30
274  END IF
275 *
276 * Compute the estimate of the reciprocal condition number.
277 *
278  IF( ainvnm.NE.zero )
279  $ rcond = ( one / ainvnm ) / anorm
280 *
281  RETURN
282 *
283 * End of DSYCON_3
284 *
subroutine dsytrs_3(UPLO, N, NRHS, A, LDA, E, IPIV, B, LDB, INFO)
DSYTRS_3
Definition: dsytrs_3.f:167
subroutine dlacn2(N, V, X, ISGN, EST, KASE, ISAVE)
DLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matrix-vec...
Definition: dlacn2.f:138
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:55
Here is the call graph for this function:
Here is the caller graph for this function: