Mercurial > octave
comparison libcruft/arpack/src/sneigh.f @ 12274:9f5d2ef078e8 release-3-4-x
import ARPACK sources to libcruft from Debian package libarpack2 2.1+parpack96.dfsg-3+b1
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 28 Jan 2011 14:04:33 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
12273:83133b5bf392 | 12274:9f5d2ef078e8 |
---|---|
1 c----------------------------------------------------------------------- | |
2 c\BeginDoc | |
3 c | |
4 c\Name: sneigh | |
5 c | |
6 c\Description: | |
7 c Compute the eigenvalues of the current upper Hessenberg matrix | |
8 c and the corresponding Ritz estimates given the current residual norm. | |
9 c | |
10 c\Usage: | |
11 c call sneigh | |
12 c ( RNORM, N, H, LDH, RITZR, RITZI, BOUNDS, Q, LDQ, WORKL, IERR ) | |
13 c | |
14 c\Arguments | |
15 c RNORM Real scalar. (INPUT) | |
16 c Residual norm corresponding to the current upper Hessenberg | |
17 c matrix H. | |
18 c | |
19 c N Integer. (INPUT) | |
20 c Size of the matrix H. | |
21 c | |
22 c H Real N by N array. (INPUT) | |
23 c H contains the current upper Hessenberg matrix. | |
24 c | |
25 c LDH Integer. (INPUT) | |
26 c Leading dimension of H exactly as declared in the calling | |
27 c program. | |
28 c | |
29 c RITZR, Real arrays of length N. (OUTPUT) | |
30 c RITZI On output, RITZR(1:N) (resp. RITZI(1:N)) contains the real | |
31 c (respectively imaginary) parts of the eigenvalues of H. | |
32 c | |
33 c BOUNDS Real array of length N. (OUTPUT) | |
34 c On output, BOUNDS contains the Ritz estimates associated with | |
35 c the eigenvalues RITZR and RITZI. This is equal to RNORM | |
36 c times the last components of the eigenvectors corresponding | |
37 c to the eigenvalues in RITZR and RITZI. | |
38 c | |
39 c Q Real N by N array. (WORKSPACE) | |
40 c Workspace needed to store the eigenvectors of H. | |
41 c | |
42 c LDQ Integer. (INPUT) | |
43 c Leading dimension of Q exactly as declared in the calling | |
44 c program. | |
45 c | |
46 c WORKL Real work array of length N**2 + 3*N. (WORKSPACE) | |
47 c Private (replicated) array on each PE or array allocated on | |
48 c the front end. This is needed to keep the full Schur form | |
49 c of H and also in the calculation of the eigenvectors of H. | |
50 c | |
51 c IERR Integer. (OUTPUT) | |
52 c Error exit flag from slaqrb or strevc. | |
53 c | |
54 c\EndDoc | |
55 c | |
56 c----------------------------------------------------------------------- | |
57 c | |
58 c\BeginLib | |
59 c | |
60 c\Local variables: | |
61 c xxxxxx real | |
62 c | |
63 c\Routines called: | |
64 c slaqrb ARPACK routine to compute the real Schur form of an | |
65 c upper Hessenberg matrix and last row of the Schur vectors. | |
66 c arscnd ARPACK utility routine for timing. | |
67 c smout ARPACK utility routine that prints matrices | |
68 c svout ARPACK utility routine that prints vectors. | |
69 c slacpy LAPACK matrix copy routine. | |
70 c slapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully. | |
71 c strevc LAPACK routine to compute the eigenvectors of a matrix | |
72 c in upper quasi-triangular form | |
73 c sgemv Level 2 BLAS routine for matrix vector multiplication. | |
74 c scopy Level 1 BLAS that copies one vector to another . | |
75 c snrm2 Level 1 BLAS that computes the norm of a vector. | |
76 c sscal Level 1 BLAS that scales a vector. | |
77 c | |
78 c | |
79 c\Author | |
80 c Danny Sorensen Phuong Vu | |
81 c Richard Lehoucq CRPC / Rice University | |
82 c Dept. of Computational & Houston, Texas | |
83 c Applied Mathematics | |
84 c Rice University | |
85 c Houston, Texas | |
86 c | |
87 c\Revision history: | |
88 c xx/xx/92: Version ' 2.1' | |
89 c | |
90 c\SCCS Information: @(#) | |
91 c FILE: neigh.F SID: 2.3 DATE OF SID: 4/20/96 RELEASE: 2 | |
92 c | |
93 c\Remarks | |
94 c None | |
95 c | |
96 c\EndLib | |
97 c | |
98 c----------------------------------------------------------------------- | |
99 c | |
100 subroutine sneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, | |
101 & q, ldq, workl, ierr) | |
102 c | |
103 c %----------------------------------------------------% | |
104 c | Include files for debugging and timing information | | |
105 c %----------------------------------------------------% | |
106 c | |
107 include 'debug.h' | |
108 include 'stat.h' | |
109 c | |
110 c %------------------% | |
111 c | Scalar Arguments | | |
112 c %------------------% | |
113 c | |
114 integer ierr, n, ldh, ldq | |
115 Real | |
116 & rnorm | |
117 c | |
118 c %-----------------% | |
119 c | Array Arguments | | |
120 c %-----------------% | |
121 c | |
122 Real | |
123 & bounds(n), h(ldh,n), q(ldq,n), ritzi(n), ritzr(n), | |
124 & workl(n*(n+3)) | |
125 c | |
126 c %------------% | |
127 c | Parameters | | |
128 c %------------% | |
129 c | |
130 Real | |
131 & one, zero | |
132 parameter (one = 1.0E+0, zero = 0.0E+0) | |
133 c | |
134 c %------------------------% | |
135 c | Local Scalars & Arrays | | |
136 c %------------------------% | |
137 c | |
138 logical select(1) | |
139 integer i, iconj, msglvl | |
140 Real | |
141 & temp, vl(1) | |
142 c | |
143 c %----------------------% | |
144 c | External Subroutines | | |
145 c %----------------------% | |
146 c | |
147 external scopy, slacpy, slaqrb, strevc, svout, arscnd | |
148 c | |
149 c %--------------------% | |
150 c | External Functions | | |
151 c %--------------------% | |
152 c | |
153 Real | |
154 & slapy2, snrm2 | |
155 external slapy2, snrm2 | |
156 c | |
157 c %---------------------% | |
158 c | Intrinsic Functions | | |
159 c %---------------------% | |
160 c | |
161 intrinsic abs | |
162 c | |
163 c %-----------------------% | |
164 c | Executable Statements | | |
165 c %-----------------------% | |
166 c | |
167 c | |
168 c %-------------------------------% | |
169 c | Initialize timing statistics | | |
170 c | & message level for debugging | | |
171 c %-------------------------------% | |
172 c | |
173 call arscnd (t0) | |
174 msglvl = mneigh | |
175 c | |
176 if (msglvl .gt. 2) then | |
177 call smout (logfil, n, n, h, ldh, ndigit, | |
178 & '_neigh: Entering upper Hessenberg matrix H ') | |
179 end if | |
180 c | |
181 c %-----------------------------------------------------------% | |
182 c | 1. Compute the eigenvalues, the last components of the | | |
183 c | corresponding Schur vectors and the full Schur form T | | |
184 c | of the current upper Hessenberg matrix H. | | |
185 c | slaqrb returns the full Schur form of H in WORKL(1:N**2) | | |
186 c | and the last components of the Schur vectors in BOUNDS. | | |
187 c %-----------------------------------------------------------% | |
188 c | |
189 call slacpy ('All', n, n, h, ldh, workl, n) | |
190 call slaqrb (.true., n, 1, n, workl, n, ritzr, ritzi, bounds, | |
191 & ierr) | |
192 if (ierr .ne. 0) go to 9000 | |
193 c | |
194 if (msglvl .gt. 1) then | |
195 call svout (logfil, n, bounds, ndigit, | |
196 & '_neigh: last row of the Schur matrix for H') | |
197 end if | |
198 c | |
199 c %-----------------------------------------------------------% | |
200 c | 2. Compute the eigenvectors of the full Schur form T and | | |
201 c | apply the last components of the Schur vectors to get | | |
202 c | the last components of the corresponding eigenvectors. | | |
203 c | Remember that if the i-th and (i+1)-st eigenvalues are | | |
204 c | complex conjugate pairs, then the real & imaginary part | | |
205 c | of the eigenvector components are split across adjacent | | |
206 c | columns of Q. | | |
207 c %-----------------------------------------------------------% | |
208 c | |
209 call strevc ('R', 'A', select, n, workl, n, vl, n, q, ldq, | |
210 & n, n, workl(n*n+1), ierr) | |
211 c | |
212 if (ierr .ne. 0) go to 9000 | |
213 c | |
214 c %------------------------------------------------% | |
215 c | Scale the returning eigenvectors so that their | | |
216 c | euclidean norms are all one. LAPACK subroutine | | |
217 c | strevc returns each eigenvector normalized so | | |
218 c | that the element of largest magnitude has | | |
219 c | magnitude 1; here the magnitude of a complex | | |
220 c | number (x,y) is taken to be |x| + |y|. | | |
221 c %------------------------------------------------% | |
222 c | |
223 iconj = 0 | |
224 do 10 i=1, n | |
225 if ( abs( ritzi(i) ) .le. zero ) then | |
226 c | |
227 c %----------------------% | |
228 c | Real eigenvalue case | | |
229 c %----------------------% | |
230 c | |
231 temp = snrm2( n, q(1,i), 1 ) | |
232 call sscal ( n, one / temp, q(1,i), 1 ) | |
233 else | |
234 c | |
235 c %-------------------------------------------% | |
236 c | Complex conjugate pair case. Note that | | |
237 c | since the real and imaginary part of | | |
238 c | the eigenvector are stored in consecutive | | |
239 c | columns, we further normalize by the | | |
240 c | square root of two. | | |
241 c %-------------------------------------------% | |
242 c | |
243 if (iconj .eq. 0) then | |
244 temp = slapy2( snrm2( n, q(1,i), 1 ), | |
245 & snrm2( n, q(1,i+1), 1 ) ) | |
246 call sscal ( n, one / temp, q(1,i), 1 ) | |
247 call sscal ( n, one / temp, q(1,i+1), 1 ) | |
248 iconj = 1 | |
249 else | |
250 iconj = 0 | |
251 end if | |
252 end if | |
253 10 continue | |
254 c | |
255 call sgemv ('T', n, n, one, q, ldq, bounds, 1, zero, workl, 1) | |
256 c | |
257 if (msglvl .gt. 1) then | |
258 call svout (logfil, n, workl, ndigit, | |
259 & '_neigh: Last row of the eigenvector matrix for H') | |
260 end if | |
261 c | |
262 c %----------------------------% | |
263 c | Compute the Ritz estimates | | |
264 c %----------------------------% | |
265 c | |
266 iconj = 0 | |
267 do 20 i = 1, n | |
268 if ( abs( ritzi(i) ) .le. zero ) then | |
269 c | |
270 c %----------------------% | |
271 c | Real eigenvalue case | | |
272 c %----------------------% | |
273 c | |
274 bounds(i) = rnorm * abs( workl(i) ) | |
275 else | |
276 c | |
277 c %-------------------------------------------% | |
278 c | Complex conjugate pair case. Note that | | |
279 c | since the real and imaginary part of | | |
280 c | the eigenvector are stored in consecutive | | |
281 c | columns, we need to take the magnitude | | |
282 c | of the last components of the two vectors | | |
283 c %-------------------------------------------% | |
284 c | |
285 if (iconj .eq. 0) then | |
286 bounds(i) = rnorm * slapy2( workl(i), workl(i+1) ) | |
287 bounds(i+1) = bounds(i) | |
288 iconj = 1 | |
289 else | |
290 iconj = 0 | |
291 end if | |
292 end if | |
293 20 continue | |
294 c | |
295 if (msglvl .gt. 2) then | |
296 call svout (logfil, n, ritzr, ndigit, | |
297 & '_neigh: Real part of the eigenvalues of H') | |
298 call svout (logfil, n, ritzi, ndigit, | |
299 & '_neigh: Imaginary part of the eigenvalues of H') | |
300 call svout (logfil, n, bounds, ndigit, | |
301 & '_neigh: Ritz estimates for the eigenvalues of H') | |
302 end if | |
303 c | |
304 call arscnd (t1) | |
305 tneigh = tneigh + (t1 - t0) | |
306 c | |
307 9000 continue | |
308 return | |
309 c | |
310 c %---------------% | |
311 c | End of sneigh | | |
312 c %---------------% | |
313 c | |
314 end |