comparison libcruft/lapack/dsyev.f @ 7034:68db500cb558

[project @ 2007-10-16 18:54:19 by jwe]
author jwe
date Tue, 16 Oct 2007 18:54:23 +0000
parents 15cddaacbc2d
children
comparison
equal deleted inserted replaced
7033:f0142f2afdc6 7034:68db500cb558
1 SUBROUTINE DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO ) 1 SUBROUTINE DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO )
2 * 2 *
3 * -- LAPACK driver routine (version 3.0) -- 3 * -- LAPACK driver routine (version 3.1) --
4 * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., 4 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
5 * Courant Institute, Argonne National Lab, and Rice University 5 * November 2006
6 * June 30, 1999
7 * 6 *
8 * .. Scalar Arguments .. 7 * .. Scalar Arguments ..
9 CHARACTER JOBZ, UPLO 8 CHARACTER JOBZ, UPLO
10 INTEGER INFO, LDA, LWORK, N 9 INTEGER INFO, LDA, LWORK, N
11 * .. 10 * ..
49 * The leading dimension of the array A. LDA >= max(1,N). 48 * The leading dimension of the array A. LDA >= max(1,N).
50 * 49 *
51 * W (output) DOUBLE PRECISION array, dimension (N) 50 * W (output) DOUBLE PRECISION array, dimension (N)
52 * If INFO = 0, the eigenvalues in ascending order. 51 * If INFO = 0, the eigenvalues in ascending order.
53 * 52 *
54 * WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) 53 * WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
55 * On exit, if INFO = 0, WORK(1) returns the optimal LWORK. 54 * On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
56 * 55 *
57 * LWORK (input) INTEGER 56 * LWORK (input) INTEGER
58 * The length of the array WORK. LWORK >= max(1,3*N-1). 57 * The length of the array WORK. LWORK >= max(1,3*N-1).
59 * For optimal efficiency, LWORK >= (NB+2)*N, 58 * For optimal efficiency, LWORK >= (NB+2)*N,
78 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) 77 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 )
79 * .. 78 * ..
80 * .. Local Scalars .. 79 * .. Local Scalars ..
81 LOGICAL LOWER, LQUERY, WANTZ 80 LOGICAL LOWER, LQUERY, WANTZ
82 INTEGER IINFO, IMAX, INDE, INDTAU, INDWRK, ISCALE, 81 INTEGER IINFO, IMAX, INDE, INDTAU, INDWRK, ISCALE,
83 $ LLWORK, LOPT, LWKOPT, NB 82 $ LLWORK, LWKOPT, NB
84 DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA, 83 DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
85 $ SMLNUM 84 $ SMLNUM
86 * .. 85 * ..
87 * .. External Functions .. 86 * .. External Functions ..
88 LOGICAL LSAME 87 LOGICAL LSAME
112 INFO = -2 111 INFO = -2
113 ELSE IF( N.LT.0 ) THEN 112 ELSE IF( N.LT.0 ) THEN
114 INFO = -3 113 INFO = -3
115 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN 114 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
116 INFO = -5 115 INFO = -5
117 ELSE IF( LWORK.LT.MAX( 1, 3*N-1 ) .AND. .NOT.LQUERY ) THEN
118 INFO = -8
119 END IF 116 END IF
120 * 117 *
121 IF( INFO.EQ.0 ) THEN 118 IF( INFO.EQ.0 ) THEN
122 NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 ) 119 NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 )
123 LWKOPT = MAX( 1, ( NB+2 )*N ) 120 LWKOPT = MAX( 1, ( NB+2 )*N )
124 WORK( 1 ) = LWKOPT 121 WORK( 1 ) = LWKOPT
122 *
123 IF( LWORK.LT.MAX( 1, 3*N-1 ) .AND. .NOT.LQUERY )
124 $ INFO = -8
125 END IF 125 END IF
126 * 126 *
127 IF( INFO.NE.0 ) THEN 127 IF( INFO.NE.0 ) THEN
128 CALL XERBLA( 'DSYEV ', -INFO ) 128 CALL XERBLA( 'DSYEV ', -INFO )
129 RETURN 129 RETURN
132 END IF 132 END IF
133 * 133 *
134 * Quick return if possible 134 * Quick return if possible
135 * 135 *
136 IF( N.EQ.0 ) THEN 136 IF( N.EQ.0 ) THEN
137 WORK( 1 ) = 1
138 RETURN 137 RETURN
139 END IF 138 END IF
140 * 139 *
141 IF( N.EQ.1 ) THEN 140 IF( N.EQ.1 ) THEN
142 W( 1 ) = A( 1, 1 ) 141 W( 1 ) = A( 1, 1 )
143 WORK( 1 ) = 3 142 WORK( 1 ) = 2
144 IF( WANTZ ) 143 IF( WANTZ )
145 $ A( 1, 1 ) = ONE 144 $ A( 1, 1 ) = ONE
146 RETURN 145 RETURN
147 END IF 146 END IF
148 * 147 *
175 INDTAU = INDE + N 174 INDTAU = INDE + N
176 INDWRK = INDTAU + N 175 INDWRK = INDTAU + N
177 LLWORK = LWORK - INDWRK + 1 176 LLWORK = LWORK - INDWRK + 1
178 CALL DSYTRD( UPLO, N, A, LDA, W, WORK( INDE ), WORK( INDTAU ), 177 CALL DSYTRD( UPLO, N, A, LDA, W, WORK( INDE ), WORK( INDTAU ),
179 $ WORK( INDWRK ), LLWORK, IINFO ) 178 $ WORK( INDWRK ), LLWORK, IINFO )
180 LOPT = 2*N + WORK( INDWRK )
181 * 179 *
182 * For eigenvalues only, call DSTERF. For eigenvectors, first call 180 * For eigenvalues only, call DSTERF. For eigenvectors, first call
183 * DORGTR to generate the orthogonal matrix, then call DSTEQR. 181 * DORGTR to generate the orthogonal matrix, then call DSTEQR.
184 * 182 *
185 IF( .NOT.WANTZ ) THEN 183 IF( .NOT.WANTZ ) THEN