1c\BeginDoc
2c
3c\Name: cnaupd
4c
5c\Description:
6c  Reverse communication interface for the Implicitly Restarted Arnoldi
7c  iteration. This is intended to be used to find a few eigenpairs of a
8c  complex linear operator OP with respect to a semi-inner product defined
9c  by a hermitian positive semi-definite real matrix B. B may be the identity
10c  matrix.  NOTE: if both OP and B are real, then ssaupd or snaupd should
11c  be used.
12c
13c
14c  The computed approximate eigenvalues are called Ritz values and
15c  the corresponding approximate eigenvectors are called Ritz vectors.
16c
17c  cnaupd is usually called iteratively to solve one of the
18c  following problems:
19c
20c  Mode 1:  A*x = lambda*x.
21c           ===> OP = A  and  B = I.
22c
23c  Mode 2:  A*x = lambda*M*x, M hermitian positive definite
24c           ===> OP = inv[M]*A  and  B = M.
25c           ===> (If M can be factored see remark 3 below)
26c
27c  Mode 3:  A*x = lambda*M*x, M hermitian semi-definite
28c           ===> OP =  inv[A - sigma*M]*M   and  B = M.
29c           ===> shift-and-invert mode
30c           If OP*x = amu*x, then lambda = sigma + 1/amu.
31c
32c
33c  NOTE: The action of w <- inv[A - sigma*M]*v or w <- inv[M]*v
34c        should be accomplished either by a direct method
35c        using a sparse matrix factorization and solving
36c
37c           [A - sigma*M]*w = v  or M*w = v,
38c
39c        or through an iterative method for solving these
40c        systems.  If an iterative method is used, the
41c        convergence test must be more stringent than
42c        the accuracy requirements for the eigenvalue
43c        approximations.
44c
45c\Usage:
46c  call cnaupd
47c     ( IDO, BMAT, N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM,
48c       IPNTR, WORKD, WORKL, LWORKL, RWORK, INFO )
49c
50c\Arguments
51c  IDO     Integer.  (INPUT/OUTPUT)
52c          Reverse communication flag.  IDO must be zero on the first
53c          call to cnaupd.  IDO will be set internally to
54c          indicate the type of operation to be performed.  Control is
55c          then given back to the calling routine which has the
56c          responsibility to carry out the requested operation and call
57c          cnaupd with the result.  The operand is given in
58c          WORKD(IPNTR(1)), the result must be put in WORKD(IPNTR(2)).
59c          -------------------------------------------------------------
60c          IDO =  0: first call to the reverse communication interface
61c          IDO = -1: compute  Y = OP * X  where
62c                    IPNTR(1) is the pointer into WORKD for X,
63c                    IPNTR(2) is the pointer into WORKD for Y.
64c                    This is for the initialization phase to force the
65c                    starting vector into the range of OP.
66c          IDO =  1: compute  Y = OP * X  where
67c                    IPNTR(1) is the pointer into WORKD for X,
68c                    IPNTR(2) is the pointer into WORKD for Y.
69c                    In mode 3, the vector B * X is already
70c                    available in WORKD(ipntr(3)).  It does not
71c                    need to be recomputed in forming OP * X.
72c          IDO =  2: compute  Y = M * X  where
73c                    IPNTR(1) is the pointer into WORKD for X,
74c                    IPNTR(2) is the pointer into WORKD for Y.
75c          IDO =  3: compute and return the shifts in the first
76c                    NP locations of WORKL.
77c          IDO = 99: done
78c          -------------------------------------------------------------
79c          After the initialization phase, when the routine is used in
80c          the "shift-and-invert" mode, the vector M * X is already
81c          available and does not need to be recomputed in forming OP*X.
82c
83c  BMAT    Character*1.  (INPUT)
84c          BMAT specifies the type of the matrix B that defines the
85c          semi-inner product for the operator OP.
86c          BMAT = 'I' -> standard eigenvalue problem A*x = lambda*x
87c          BMAT = 'G' -> generalized eigenvalue problem A*x = lambda*M*x
88c
89c  N       Integer.  (INPUT)
90c          Dimension of the eigenproblem.
91c
92c  WHICH   Character*2.  (INPUT)
93c          'LM' -> want the NEV eigenvalues of largest magnitude.
94c          'SM' -> want the NEV eigenvalues of smallest magnitude.
95c          'LR' -> want the NEV eigenvalues of largest real part.
96c          'SR' -> want the NEV eigenvalues of smallest real part.
97c          'LI' -> want the NEV eigenvalues of largest imaginary part.
98c          'SI' -> want the NEV eigenvalues of smallest imaginary part.
99c
100c  NEV     Integer.  (INPUT)
101c          Number of eigenvalues of OP to be computed. 0 < NEV < N-1.
102c
103c  TOL     Real   scalar.  (INPUT)
104c          Stopping criteria: the relative accuracy of the Ritz value
105c          is considered acceptable if BOUNDS(I) .LE. TOL*ABS(RITZ(I))
106c          where ABS(RITZ(I)) is the magnitude when RITZ(I) is complex.
107c          DEFAULT = slamch('EPS')  (machine precision as computed
108c                    by the LAPACK auxiliary subroutine slamch).
109c
110c  RESID   Complex  array of length N.  (INPUT/OUTPUT)
111c          On INPUT:
112c          If INFO .EQ. 0, a random initial residual vector is used.
113c          If INFO .NE. 0, RESID contains the initial residual vector,
114c                          possibly from a previous run.
115c          On OUTPUT:
116c          RESID contains the final residual vector.
117c
118c  NCV     Integer.  (INPUT)
119c          Number of columns of the matrix V. NCV must satisfy the two
120c          inequalities 1 <= NCV-NEV and NCV <= N.
121c          This will indicate how many Arnoldi vectors are generated
122c          at each iteration.  After the startup phase in which NEV
123c          Arnoldi vectors are generated, the algorithm generates
124c          approximately NCV-NEV Arnoldi vectors at each subsequent update
125c          iteration. Most of the cost in generating each Arnoldi vector is
126c          in the matrix-vector operation OP*x. (See remark 4 below.)
127c
128c  V       Complex  array N by NCV.  (OUTPUT)
129c          Contains the final set of Arnoldi basis vectors.
130c
131c  LDV     Integer.  (INPUT)
132c          Leading dimension of V exactly as declared in the calling program.
133c
134c  IPARAM  Integer array of length 11.  (INPUT/OUTPUT)
135c          IPARAM(1) = ISHIFT: method for selecting the implicit shifts.
136c          The shifts selected at each iteration are used to filter out
137c          the components of the unwanted eigenvector.
138c          -------------------------------------------------------------
139c          ISHIFT = 0: the shifts are to be provided by the user via
140c                      reverse communication.  The NCV eigenvalues of
141c                      the Hessenberg matrix H are returned in the part
142c                      of WORKL array corresponding to RITZ.
143c          ISHIFT = 1: exact shifts with respect to the current
144c                      Hessenberg matrix H.  This is equivalent to
145c                      restarting the iteration from the beginning
146c                      after updating the starting vector with a linear
147c                      combination of Ritz vectors associated with the
148c                      "wanted" eigenvalues.
149c          ISHIFT = 2: other choice of internal shift to be defined.
150c          -------------------------------------------------------------
151c
152c          IPARAM(2) = No longer referenced
153c
154c          IPARAM(3) = MXITER
155c          On INPUT:  maximum number of Arnoldi update iterations allowed.
156c          On OUTPUT: actual number of Arnoldi update iterations taken.
157c
158c          IPARAM(4) = NB: blocksize to be used in the recurrence.
159c          The code currently works only for NB = 1.
160c
161c          IPARAM(5) = NCONV: number of "converged" Ritz values.
162c          This represents the number of Ritz values that satisfy
163c          the convergence criterion.
164c
165c          IPARAM(6) = IUPD
166c          No longer referenced. Implicit restarting is ALWAYS used.
167c
168c          IPARAM(7) = MODE
169c          On INPUT determines what type of eigenproblem is being solved.
170c          Must be 1,2,3; See under \Description of cnaupd for the
171c          four modes available.
172c
173c          IPARAM(8) = NP
174c          When ido = 3 and the user provides shifts through reverse
175c          communication (IPARAM(1)=0), _naupd returns NP, the number
176c          of shifts the user is to provide. 0 < NP < NCV-NEV.
177c
178c          IPARAM(9) = NUMOP, IPARAM(10) = NUMOPB, IPARAM(11) = NUMREO,
179c          OUTPUT: NUMOP  = total number of OP*x operations,
180c                  NUMOPB = total number of B*x operations if BMAT='G',
181c                  NUMREO = total number of steps of re-orthogonalization.
182c
183c  IPNTR   Integer array of length 14.  (OUTPUT)
184c          Pointer to mark the starting locations in the WORKD and WORKL
185c          arrays for matrices/vectors used by the Arnoldi iteration.
186c          -------------------------------------------------------------
187c          IPNTR(1): pointer to the current operand vector X in WORKD.
188c          IPNTR(2): pointer to the current result vector Y in WORKD.
189c          IPNTR(3): pointer to the vector B * X in WORKD when used in
190c                    the shift-and-invert mode.
191c          IPNTR(4): pointer to the next available location in WORKL
192c                    that is untouched by the program.
193c          IPNTR(5): pointer to the NCV by NCV upper Hessenberg
194c                    matrix H in WORKL.
195c          IPNTR(6): pointer to the  ritz value array  RITZ
196c          IPNTR(7): pointer to the (projected) ritz vector array Q
197c          IPNTR(8): pointer to the error BOUNDS array in WORKL.
198c          IPNTR(14): pointer to the NP shifts in WORKL. See Remark 5 below.
199c
200c          Note: IPNTR(9:13) is only referenced by cneupd. See Remark 2 below.
201c
202c          IPNTR(9): pointer to the NCV RITZ values of the
203c                    original system.
204c          IPNTR(10): Not Used
205c          IPNTR(11): pointer to the NCV corresponding error bounds.
206c          IPNTR(12): pointer to the NCV by NCV upper triangular
207c                     Schur matrix for H.
208c          IPNTR(13): pointer to the NCV by NCV matrix of eigenvectors
209c                     of the upper Hessenberg matrix H. Only referenced by
210c                     cneupd if RVEC = .TRUE. See Remark 2 below.
211c
212c          -------------------------------------------------------------
213c
214c  WORKD   Complex  work array of length 3*N.  (REVERSE COMMUNICATION)
215c          Distributed array to be used in the basic Arnoldi iteration
216c          for reverse communication.  The user should not use WORKD
217c          as temporary workspace during the iteration !!!!!!!!!!
218c          See Data Distribution Note below.
219c
220c  WORKL   Complex  work array of length LWORKL.  (OUTPUT/WORKSPACE)
221c          Private (replicated) array on each PE or array allocated on
222c          the front end.  See Data Distribution Note below.
223c
224c  LWORKL  Integer.  (INPUT)
225c          LWORKL must be at least 3*NCV**2 + 5*NCV.
226c
227c  RWORK   Real   work array of length NCV (WORKSPACE)
228c          Private (replicated) array on each PE or array allocated on
229c          the front end.
230c
231c
232c  INFO    Integer.  (INPUT/OUTPUT)
233c          If INFO .EQ. 0, a randomly initial residual vector is used.
234c          If INFO .NE. 0, RESID contains the initial residual vector,
235c                          possibly from a previous run.
236c          Error flag on output.
237c          =  0: Normal exit.
238c          =  1: Maximum number of iterations taken.
239c                All possible eigenvalues of OP has been found. IPARAM(5)
240c                returns the number of wanted converged Ritz values.
241c          =  2: No longer an informational error. Deprecated starting
242c                with release 2 of ARPACK.
243c          =  3: No shifts could be applied during a cycle of the
244c                Implicitly restarted Arnoldi iteration. One possibility
245c                is to increase the size of NCV relative to NEV.
246c                See remark 4 below.
247c          = -1: N must be positive.
248c          = -2: NEV must be positive.
249c          = -3: NCV-NEV >= 2 and less than or equal to N.
250c          = -4: The maximum number of Arnoldi update iteration
251c                must be greater than zero.
252c          = -5: WHICH must be one of 'LM', 'SM', 'LR', 'SR', 'LI', 'SI'
253c          = -6: BMAT must be one of 'I' or 'G'.
254c          = -7: Length of private work array is not sufficient.
255c          = -8: Error return from LAPACK eigenvalue calculation;
256c          = -9: Starting vector is zero.
257c          = -10: IPARAM(7) must be 1,2,3.
258c          = -11: IPARAM(7) = 1 and BMAT = 'G' are incompatible.
259c          = -12: IPARAM(1) must be equal to 0 or 1.
260c          = -9999: Could not build an Arnoldi factorization.
261c                   User input error highly likely.  Please
262c                   check actual array dimensions and layout.
263c                   IPARAM(5) returns the size of the current Arnoldi
264c                   factorization.
265c
266c\Remarks
267c  1. The computed Ritz values are approximate eigenvalues of OP. The
268c     selection of WHICH should be made with this in mind when using
269c     Mode = 3.  When operating in Mode = 3 setting WHICH = 'LM' will
270c     compute the NEV eigenvalues of the original problem that are
271c     closest to the shift SIGMA . After convergence, approximate eigenvalues
272c     of the original problem may be obtained with the ARPACK subroutine cneupd.
273c
274c  2. If a basis for the invariant subspace corresponding to the converged Ritz
275c     values is needed, the user must call cneupd immediately following
276c     completion of cnaupd. This is new starting with release 2 of ARPACK.
277c
278c  3. If M can be factored into a Cholesky factorization M = LL`
279c     then Mode = 2 should not be selected.  Instead one should use
280c     Mode = 1 with  OP = inv(L)*A*inv(L`).  Appropriate triangular
281c     linear systems should be solved with L and L` rather
282c     than computing inverses.  After convergence, an approximate
283c     eigenvector z of the original problem is recovered by solving
284c     L`z = x  where x is a Ritz vector of OP.
285c
286c  4. At present there is no a-priori analysis to guide the selection
287c     of NCV relative to NEV.  The only formal requirement is that NCV > NEV + 1.
288c     However, it is recommended that NCV .ge. 2*NEV.  If many problems of
289c     the same type are to be solved, one should experiment with increasing
290c     NCV while keeping NEV fixed for a given test problem.  This will
291c     usually decrease the required number of OP*x operations but it
292c     also increases the work and storage required to maintain the orthogonal
293c     basis vectors.  The optimal "cross-over" with respect to CPU time
294c     is problem dependent and must be determined empirically.
295c     See Chapter 8 of Reference 2 for further information.
296c
297c  5. When IPARAM(1) = 0, and IDO = 3, the user needs to provide the
298c     NP = IPARAM(8) complex shifts in locations
299c     WORKL(IPNTR(14)), WORKL(IPNTR(14)+1), ... , WORKL(IPNTR(14)+NP).
300c     Eigenvalues of the current upper Hessenberg matrix are located in
301c     WORKL(IPNTR(6)) through WORKL(IPNTR(6)+NCV-1). They are ordered
302c     according to the order defined by WHICH.  The associated Ritz estimates
303c     are located in WORKL(IPNTR(8)), WORKL(IPNTR(8)+1), ... ,
304c     WORKL(IPNTR(8)+NCV-1).
305c
306c-----------------------------------------------------------------------
307c
308c\Data Distribution Note:
309c
310c  Fortran-D syntax:
311c  ================
312c  Complex  resid(n), v(ldv,ncv), workd(3*n), workl(lworkl)
313c  decompose  d1(n), d2(n,ncv)
314c  align      resid(i) with d1(i)
315c  align      v(i,j)   with d2(i,j)
316c  align      workd(i) with d1(i)     range (1:n)
317c  align      workd(i) with d1(i-n)   range (n+1:2*n)
318c  align      workd(i) with d1(i-2*n) range (2*n+1:3*n)
319c  distribute d1(block), d2(block,:)
320c  replicated workl(lworkl)
321c
322c  Cray MPP syntax:
323c  ===============
324c  Complex  resid(n), v(ldv,ncv), workd(n,3), workl(lworkl)
325c  shared     resid(block), v(block,:), workd(block,:)
326c  replicated workl(lworkl)
327c
328c  CM2/CM5 syntax:
329c  ==============
330c
331c-----------------------------------------------------------------------
332c
333c     include   'ex-nonsym.doc'
334c
335c-----------------------------------------------------------------------
336c
337c\BeginLib
338c
339c\Local variables:
340c     xxxxxx  Complex
341c
342c\References:
343c  1. D.C. Sorensen, "Implicit Application of Polynomial Filters in
344c     a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992),
345c     pp 357-385.
346c  2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly
347c     Restarted Arnoldi Iteration", Rice University Technical Report
348c     TR95-13, Department of Computational and Applied Mathematics.
349c  3. B.N. Parlett & Y. Saad, "_Complex_ Shift and Invert Strategies for
350c     _Real_ Matrices", Linear Algebra and its Applications, vol 88/89,
351c     pp 575-595, (1987).
352c
353c\Routines called:
354c     cnaup2  ARPACK routine that implements the Implicitly Restarted
355c             Arnoldi Iteration.
356c     cstatn  ARPACK routine that initializes the timing variables.
357c     ivout   ARPACK utility routine that prints integers.
358c     cvout   ARPACK utility routine that prints vectors.
359c     arscnd  ARPACK utility routine for timing.
360c     slamch  LAPACK routine that determines machine constants.
361c
362c\Author
363c     Danny Sorensen               Phuong Vu
364c     Richard Lehoucq              CRPC / Rice University
365c     Dept. of Computational &     Houston, Texas
366c     Applied Mathematics
367c     Rice University
368c     Houston, Texas
369c
370c\SCCS Information: @(#)
371c FILE: naupd.F   SID: 2.8   DATE OF SID: 04/10/01   RELEASE: 2
372c
373c\Remarks
374c
375c\EndLib
376c
377c-----------------------------------------------------------------------
378c
379      subroutine cnaupd
380     &   ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam,
381     &     ipntr, workd, workl, lworkl, rwork, info )
382c
383c     %----------------------------------------------------%
384c     | Include files for debugging and timing information |
385c     %----------------------------------------------------%
386c
387      include   'debug.h'
388      include   'stat.h'
389c
390c     %------------------%
391c     | Scalar Arguments |
392c     %------------------%
393c
394      character  bmat*1, which*2
395      integer    ido, info, ldv, lworkl, n, ncv, nev
396      Real
397     &           tol
398c
399c     %-----------------%
400c     | Array Arguments |
401c     %-----------------%
402c
403      integer    iparam(11), ipntr(14)
404      Complex
405     &           resid(n), v(ldv,ncv), workd(3*n), workl(lworkl)
406      Real
407     &           rwork(ncv)
408c
409c     %------------%
410c     | Parameters |
411c     %------------%
412c
413      Complex
414     &           one, zero
415      parameter (one = (1.0E+0, 0.0E+0) , zero = (0.0E+0, 0.0E+0) )
416c
417c     %---------------%
418c     | Local Scalars |
419c     %---------------%
420c
421      integer    bounds, ierr, ih, iq, ishift, iupd, iw,
422     &           ldh, ldq, levec, mode, msglvl, mxiter, nb,
423     &           nev0, next, np, ritz, j
424      save       bounds, ih, iq, ishift, iupd, iw,
425     &           ldh, ldq, levec, mode, msglvl, mxiter, nb,
426     &           nev0, next, np, ritz
427c
428c     %----------------------%
429c     | External Subroutines |
430c     %----------------------%
431c
432      external   cnaup2, cvout, ivout, arscnd, cstatn
433c
434c     %--------------------%
435c     | External Functions |
436c     %--------------------%
437c
438      Real
439     &           slamch
440      external   slamch
441c
442c     %-----------------------%
443c     | Executable Statements |
444c     %-----------------------%
445c
446      if (ido .eq. 0) then
447c
448c        %-------------------------------%
449c        | Initialize timing statistics  |
450c        | & message level for debugging |
451c        %-------------------------------%
452c
453         call cstatn
454         call arscnd (t0)
455         msglvl = mcaupd
456c
457c        %----------------%
458c        | Error checking |
459c        %----------------%
460c
461         ierr   = 0
462         ishift = iparam(1)
463c         levec  = iparam(2)
464         mxiter = iparam(3)
465c         nb     = iparam(4)
466         nb     = 1
467c
468c        %--------------------------------------------%
469c        | Revision 2 performs only implicit restart. |
470c        %--------------------------------------------%
471c
472         iupd   = 1
473         mode   = iparam(7)
474c
475         if (n .le. 0) then
476             ierr = -1
477         else if (nev .le. 0) then
478             ierr = -2
479         else if (ncv .le. nev .or.  ncv .gt. n) then
480             ierr = -3
481         else if (mxiter .le. 0) then
482             ierr = -4
483         else if (which .ne. 'LM' .and.
484     &       which .ne. 'SM' .and.
485     &       which .ne. 'LR' .and.
486     &       which .ne. 'SR' .and.
487     &       which .ne. 'LI' .and.
488     &       which .ne. 'SI') then
489            ierr = -5
490         else if (bmat .ne. 'I' .and. bmat .ne. 'G') then
491            ierr = -6
492         else if (lworkl .lt. 3*ncv**2 + 5*ncv) then
493            ierr = -7
494         else if (mode .lt. 1 .or. mode .gt. 3) then
495                                                ierr = -10
496         else if (mode .eq. 1 .and. bmat .eq. 'G') then
497                                                ierr = -11
498         end if
499c
500c        %------------%
501c        | Error Exit |
502c        %------------%
503c
504         if (ierr .ne. 0) then
505            info = ierr
506            ido  = 99
507            go to 9000
508         end if
509c
510c        %------------------------%
511c        | Set default parameters |
512c        %------------------------%
513c
514         if (nb .le. 0)				nb = 1
515         if (tol .le. 0.0E+0  )			tol = slamch('EpsMach')
516         if (ishift .ne. 0  .and.
517     &       ishift .ne. 1  .and.
518     &       ishift .ne. 2) 			ishift = 1
519c
520c        %----------------------------------------------%
521c        | NP is the number of additional steps to      |
522c        | extend the length NEV Lanczos factorization. |
523c        | NEV0 is the local variable designating the   |
524c        | size of the invariant subspace desired.      |
525c        %----------------------------------------------%
526c
527         np     = ncv - nev
528         nev0   = nev
529c
530c        %-----------------------------%
531c        | Zero out internal workspace |
532c        %-----------------------------%
533c
534         do 10 j = 1, 3*ncv**2 + 5*ncv
535            workl(j) = zero
536  10     continue
537c
538c        %-------------------------------------------------------------%
539c        | Pointer into WORKL for address of H, RITZ, BOUNDS, Q        |
540c        | etc... and the remaining workspace.                         |
541c        | Also update pointer to be used on output.                   |
542c        | Memory is laid out as follows:                              |
543c        | workl(1:ncv*ncv) := generated Hessenberg matrix             |
544c        | workl(ncv*ncv+1:ncv*ncv+ncv) := the ritz values             |
545c        | workl(ncv*ncv+ncv+1:ncv*ncv+2*ncv)   := error bounds        |
546c        | workl(ncv*ncv+2*ncv+1:2*ncv*ncv+2*ncv) := rotation matrix Q |
547c        | workl(2*ncv*ncv+2*ncv+1:3*ncv*ncv+5*ncv) := workspace       |
548c        | The final workspace is needed by subroutine cneigh called   |
549c        | by cnaup2. Subroutine cneigh calls LAPACK routines for      |
550c        | calculating eigenvalues and the last row of the eigenvector |
551c        | matrix.                                                     |
552c        %-------------------------------------------------------------%
553c
554         ldh    = ncv
555         ldq    = ncv
556         ih     = 1
557         ritz   = ih     + ldh*ncv
558         bounds = ritz   + ncv
559         iq     = bounds + ncv
560         iw     = iq     + ldq*ncv
561         next   = iw     + ncv**2 + 3*ncv
562c
563         ipntr(4) = next
564         ipntr(5) = ih
565         ipntr(6) = ritz
566         ipntr(7) = iq
567         ipntr(8) = bounds
568         ipntr(14) = iw
569      end if
570c
571c     %-------------------------------------------------------%
572c     | Carry out the Implicitly restarted Arnoldi Iteration. |
573c     %-------------------------------------------------------%
574c
575      call cnaup2
576     &   ( ido, bmat, n, which, nev0, np, tol, resid, mode, iupd,
577     &     ishift, mxiter, v, ldv, workl(ih), ldh, workl(ritz),
578     &     workl(bounds), workl(iq), ldq, workl(iw),
579     &     ipntr, workd, rwork, info )
580c
581c     %--------------------------------------------------%
582c     | ido .ne. 99 implies use of reverse communication |
583c     | to compute operations involving OP.              |
584c     %--------------------------------------------------%
585c
586      if (ido .eq. 3) iparam(8) = np
587      if (ido .ne. 99) go to 9000
588c
589      iparam(3) = mxiter
590      iparam(5) = np
591      iparam(9) = nopx
592      iparam(10) = nbx
593      iparam(11) = nrorth
594c
595c     %------------------------------------%
596c     | Exit if there was an informational |
597c     | error within cnaup2.               |
598c     %------------------------------------%
599c
600      if (info .lt. 0) go to 9000
601      if (info .eq. 2) info = 3
602c
603      if (msglvl .gt. 0) then
604         call ivout (logfil, 1, [mxiter], ndigit,
605     &               '_naupd: Number of update iterations taken')
606         call ivout (logfil, 1, [np], ndigit,
607     &               '_naupd: Number of wanted "converged" Ritz values')
608         call cvout (logfil, np, workl(ritz), ndigit,
609     &               '_naupd: The final Ritz values')
610         call cvout (logfil, np, workl(bounds), ndigit,
611     &               '_naupd: Associated Ritz estimates')
612      end if
613c
614      call arscnd (t1)
615      tcaupd = t1 - t0
616c
617      if (msglvl .gt. 0) then
618c
619c        %--------------------------------------------------------%
620c        | Version Number & Version Date are defined in version.h |
621c        %--------------------------------------------------------%
622c
623         write (6,1000)
624         write (6,1100) mxiter, nopx, nbx, nrorth, nitref, nrstrt,
625     &                  tmvopx, tmvbx, tcaupd, tcaup2, tcaitr, titref,
626     &                  tgetv0, tceigh, tcgets, tcapps, tcconv, trvec
627 1000    format (//,
628     &      5x, '=============================================',/
629     &      5x, '= Complex implicit Arnoldi update code      =',/
630     &      5x, '= Version Number: ', ' 2.3' , 21x, ' =',/
631     &      5x, '= Version Date:   ', ' 07/31/96' , 16x,   ' =',/
632     &      5x, '=============================================',/
633     &      5x, '= Summary of timing statistics              =',/
634     &      5x, '=============================================',//)
635 1100    format (
636     &      5x, 'Total number update iterations             = ', i5,/
637     &      5x, 'Total number of OP*x operations            = ', i5,/
638     &      5x, 'Total number of B*x operations             = ', i5,/
639     &      5x, 'Total number of reorthogonalization steps  = ', i5,/
640     &      5x, 'Total number of iterative refinement steps = ', i5,/
641     &      5x, 'Total number of restart steps              = ', i5,/
642     &      5x, 'Total time in user OP*x operation          = ', f12.6,/
643     &      5x, 'Total time in user B*x operation           = ', f12.6,/
644     &      5x, 'Total time in Arnoldi update routine       = ', f12.6,/
645     &      5x, 'Total time in naup2 routine                = ', f12.6,/
646     &      5x, 'Total time in basic Arnoldi iteration loop = ', f12.6,/
647     &      5x, 'Total time in reorthogonalization phase    = ', f12.6,/
648     &      5x, 'Total time in (re)start vector generation  = ', f12.6,/
649     &      5x, 'Total time in Hessenberg eig. subproblem   = ', f12.6,/
650     &      5x, 'Total time in getting the shifts           = ', f12.6,/
651     &      5x, 'Total time in applying the shifts          = ', f12.6,/
652     &      5x, 'Total time in convergence testing          = ', f12.6,/
653     &      5x, 'Total time in computing final Ritz vectors = ', f12.6/)
654      end if
655c
656 9000 continue
657c
658      return
659c
660c     %---------------%
661c     | End of cnaupd |
662c     %---------------%
663c
664      end
665