Actual source code: iterativ.c

  2: /*
  3:    This file contains some simple default routines.  
  4:  */
 5:  #include src/eps/epsimpl.h

  9: /*@
 10:    EPSGetIterationNumber - Gets the current iteration number. If the 
 11:    call to EPSSolve() is complete, then it returns the number of iterations 
 12:    carried out by the solution method.
 13:  
 14:    Not Collective

 16:    Input Parameter:
 17: .  eps - the eigensolver context

 19:    Output Parameter:
 20: .  its - number of iterations

 22:    Level: intermediate

 24:    Notes:
 25:       During the i-th iteration this call returns i-1. If EPSSolve() is 
 26:       complete, then parameter "its" contains either the iteration number at
 27:       which convergence was successfully reached, or failure was detected.  
 28:       Call EPSGetConvergedReason() to determine if the solver converged or 
 29:       failed and why.

 31: @*/
 32: int EPSGetIterationNumber(EPS eps,int *its)
 33: {
 37:   *its = eps->its;
 38:   return(0);
 39: }

 43: /*@
 44:    EPSGetNumberLinearIterations - Gets the total number of iterations
 45:    required by the linear solves associated to the ST object during the 
 46:    last EPSSolve() call.

 48:    Not Collective

 50:    Input Parameter:
 51: .  eps - EPS context

 53:    Output Parameter:
 54: .  lits - number of linear iterations

 56:    Notes:
 57:    When the eigensolver algorithm invokes STApply() then a linear system 
 58:    must be solved (except in the case of standard eigenproblems and shift
 59:    transformation). The number of iterations required in this solve is
 60:    accumulated into a counter whose value is returned by this function.

 62:    The iteration counter is reset to zero at each successive call to EPSSolve().

 64:    Level: intermediate

 66: @*/
 67: int EPSGetNumberLinearIterations(EPS eps,int* lits)
 68: {
 72:   STGetNumberLinearIterations(eps->OP, lits);
 73:   return(0);
 74: }

 78: /*@C
 79:    EPSDefaultEstimatesMonitor - Print the error estimates at each iteration 
 80:    of the eigensolver.

 82:    Collective on EPS

 84:    Input Parameters:
 85: +  eps    - eigensolver context
 86: .  its    - iteration number
 87: .  nconv  - number of converged eigenpairs so far
 88: .  errest - error estimates
 89: .  nest   - number of error estimates to display
 90: -  dummy  - unused monitor context 

 92:    Level: intermediate

 94: .seealso: EPSSetMonitor()
 95: @*/
 96: int EPSDefaultEstimatesMonitor(EPS eps,int its,int nconv,PetscReal *errest,int nest,void *dummy)
 97: {
 98:   int         i,ierr;
 99:   PetscViewer viewer = (PetscViewer) dummy;

102:   if (!viewer) viewer = PETSC_VIEWER_STDOUT_(eps->comm);
103:   PetscViewerASCIIPrintf(viewer,"%3d EPS nconv=%d Error Estimates:",its,nconv);
104:   for (i=0;i<nest;i++) {
105:     PetscViewerASCIIPrintf(viewer," %10.8e",errest[i]);
106:   }
107:   PetscViewerASCIIPrintf(viewer,"\n");
108:   return(0);
109: }

113: /*@C
114:    EPSDefaultValuesMonitor - Print the current approximate values of the
115:    eigenvalues.

117:    Collective on EPS

119:    Input Parameters:
120: +  eps    - eigensolver context
121: .  its    - iteration number
122: .  nconv  - number of converged eigenpairs so far
123: .  eigr   - real part of the eigenvalues
124: .  eigi   - imaginary part of the eigenvalues (can be PETSC_NULL)
125: .  neig   - number of eigenvalues to display
126: -  dummy  - unused monitor context 

128:    Level: intermediate

130: .seealso: EPSSetValuesMonitor()
131: @*/
132: int EPSDefaultValuesMonitor(EPS eps,int its,int nconv,PetscScalar *eigr,PetscScalar *eigi,int neig,void *dummy)
133: {
134:   int         i,ierr;
135:   PetscViewer viewer = (PetscViewer) dummy;

138:   if (!viewer) viewer = PETSC_VIEWER_STDOUT_(eps->comm);
139:   PetscViewerASCIIPrintf(viewer,"%3d EPS nconv=%d Values:",its,nconv);
140:   for (i=0;i<neig;i++) {
141: #if defined(PETSC_USE_COMPLEX)
142:     PetscViewerASCIIPrintf(viewer," %g%+gi",PetscRealPart(eigr[i]),PetscImaginaryPart(eigr[i]));
143: #else
144:     PetscViewerASCIIPrintf(viewer," %g",eigr[i]);
145:     if (eigi && eigi[i]!=0.0) { PetscViewerASCIIPrintf(viewer,"%+gi",eigi[i]); }
146: #endif
147:   }
148:   PetscViewerASCIIPrintf(viewer,"\n");
149:   return(0);
150: }

154: /*
155:   EPSDefaultGetWork - Gets a number of work vectors.

157:   Input Parameters:
158: + eps  - eigensolver context
159: - nw   - number of work vectors to allocate

161:   Notes:
162:   Call this only if no work vectors have been allocated.

164:  */
165: int  EPSDefaultGetWork(EPS eps, int nw)
166: {

170:   if (eps->work) {EPSDefaultFreeWork( eps );}
171:   eps->nwork = nw;
172:   VecDuplicateVecs(eps->vec_initial,nw,&eps->work);
173:   PetscLogObjectParents(eps,nw,eps->work);
174:   return(0);
175: }

179: /*
180:   EPSDefaultFreeWork - Free work vectors.

182:   Input Parameters:
183: . eps  - eigensolver context

185:  */
186: int EPSDefaultFreeWork(EPS eps)
187: {
191:   if (eps->work)  {
192:     VecDestroyVecs(eps->work,eps->nwork);
193:   }
194:   return(0);
195: }

199: /*
200:   EPSDefaultDestroy - Destroys an eigensolver context variable for methods 
201:   with no separate context. Preferred calling sequence EPSDestroy().

203:   Input Parameter: 
204: . eps - the eigensolver context

206: */
207: int EPSDefaultDestroy(EPS eps)
208: {

213:   if (eps->data) {PetscFree(eps->data);}

215:   /* free work vectors */
216:   EPSDefaultFreeWork( eps );
217:   return(0);
218: }

222: /*@C
223:    EPSGetConvergedReason - Gets the reason why the EPSSolve() iteration was 
224:    stopped.

226:    Not Collective

228:    Input Parameter:
229: .  eps - the eigensolver context

231:    Output Parameter:
232: .  reason - negative value indicates diverged, positive value converged
233:    (see EPSConvergedReason)

235:    Possible values for reason:
236: +  EPS_CONVERGED_TOL - converged up to tolerance
237: .  EPS_DIVERGED_ITS - required more than its to reach convergence
238: .  EPS_DIVERGED_BREAKDOWN - generic breakdown in method
239: -  EPS_DIVERGED_NONSYMMETRIC - The operator is nonsymmetric

241:    Level: intermediate

243:    Notes: Can only be called after the call to EPSSolve() is complete.

245: .seealso: EPSSetTolerances(), EPSSolve(), EPSConvergedReason
246: @*/
247: int EPSGetConvergedReason(EPS eps,EPSConvergedReason *reason)
248: {
251:   *reason = eps->reason;
252:   return(0);
253: }