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: }