xref: /petsc/src/snes/interface/snesut.c (revision d43b4f6e3978b3cce59accb2c715ae61affd6e1c)
1e7e93795SLois Curfman McInnes 
2af0996ceSBarry Smith #include <petsc/private/snesimpl.h>       /*I   "petsc/private/snesimpl.h"   I*/
3636fd056SMatthew G. Knepley #include <petscdm.h>
42e7541e6SPeter Brune #include <petscblaslapack.h>
5e7e93795SLois Curfman McInnes 
64a2ae208SSatish Balay #undef __FUNCT__
7a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorSolution"
83f1db9ecSBarry Smith /*@C
9a6570f20SBarry Smith    SNESMonitorSolution - Monitors progress of the SNES solvers by calling
1036851e7fSLois Curfman McInnes    VecView() for the approximate solution at each iteration.
113f1db9ecSBarry Smith 
123f1db9ecSBarry Smith    Collective on SNES
133f1db9ecSBarry Smith 
143f1db9ecSBarry Smith    Input Parameters:
153f1db9ecSBarry Smith +  snes - the SNES context
163f1db9ecSBarry Smith .  its - iteration number
174b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
18f55353a2SBarry Smith -  dummy -  a viewer
193f1db9ecSBarry Smith 
2036851e7fSLois Curfman McInnes    Level: intermediate
213f1db9ecSBarry Smith 
2236851e7fSLois Curfman McInnes .keywords: SNES, nonlinear, vector, monitor, view
233f1db9ecSBarry Smith 
24a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView()
253f1db9ecSBarry Smith @*/
26*d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorSolution(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
273f1db9ecSBarry Smith {
28dfbe8321SBarry Smith   PetscErrorCode ierr;
293f1db9ecSBarry Smith   Vec            x;
30*d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
313f1db9ecSBarry Smith 
323f1db9ecSBarry Smith   PetscFunctionBegin;
334d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
343f1db9ecSBarry Smith   ierr = SNESGetSolution(snes,&x);CHKERRQ(ierr);
35*d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
363f1db9ecSBarry Smith   ierr = VecView(x,viewer);CHKERRQ(ierr);
37*d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
383f1db9ecSBarry Smith   PetscFunctionReturn(0);
393f1db9ecSBarry Smith }
403f1db9ecSBarry Smith 
414a2ae208SSatish Balay #undef __FUNCT__
42a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorResidual"
435ed2d596SBarry Smith /*@C
44a6570f20SBarry Smith    SNESMonitorResidual - Monitors progress of the SNES solvers by calling
455ed2d596SBarry Smith    VecView() for the residual at each iteration.
465ed2d596SBarry Smith 
475ed2d596SBarry Smith    Collective on SNES
485ed2d596SBarry Smith 
495ed2d596SBarry Smith    Input Parameters:
505ed2d596SBarry Smith +  snes - the SNES context
515ed2d596SBarry Smith .  its - iteration number
524b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
53f55353a2SBarry Smith -  dummy -  a viewer
545ed2d596SBarry Smith 
555ed2d596SBarry Smith    Level: intermediate
565ed2d596SBarry Smith 
575ed2d596SBarry Smith .keywords: SNES, nonlinear, vector, monitor, view
585ed2d596SBarry Smith 
59a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView()
605ed2d596SBarry Smith @*/
61*d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorResidual(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
625ed2d596SBarry Smith {
63dfbe8321SBarry Smith   PetscErrorCode ierr;
645ed2d596SBarry Smith   Vec            x;
65*d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
665ed2d596SBarry Smith 
675ed2d596SBarry Smith   PetscFunctionBegin;
684d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
695ed2d596SBarry Smith   ierr = SNESGetFunction(snes,&x,0,0);CHKERRQ(ierr);
70*d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
715ed2d596SBarry Smith   ierr = VecView(x,viewer);CHKERRQ(ierr);
72*d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
735ed2d596SBarry Smith   PetscFunctionReturn(0);
745ed2d596SBarry Smith }
755ed2d596SBarry Smith 
765ed2d596SBarry Smith #undef __FUNCT__
77a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorSolutionUpdate"
78d132466eSBarry Smith /*@C
79a6570f20SBarry Smith    SNESMonitorSolutionUpdate - Monitors progress of the SNES solvers by calling
80d132466eSBarry Smith    VecView() for the UPDATE to the solution at each iteration.
81d132466eSBarry Smith 
82d132466eSBarry Smith    Collective on SNES
83d132466eSBarry Smith 
84d132466eSBarry Smith    Input Parameters:
85d132466eSBarry Smith +  snes - the SNES context
86d132466eSBarry Smith .  its - iteration number
874b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
88f55353a2SBarry Smith -  dummy - a viewer
89d132466eSBarry Smith 
90d132466eSBarry Smith    Level: intermediate
91d132466eSBarry Smith 
92d132466eSBarry Smith .keywords: SNES, nonlinear, vector, monitor, view
93d132466eSBarry Smith 
94a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView()
95d132466eSBarry Smith @*/
96*d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorSolutionUpdate(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
97d132466eSBarry Smith {
98dfbe8321SBarry Smith   PetscErrorCode ierr;
99d132466eSBarry Smith   Vec            x;
100*d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
101d132466eSBarry Smith 
102d132466eSBarry Smith   PetscFunctionBegin;
1034d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
104d132466eSBarry Smith   ierr = SNESGetSolutionUpdate(snes,&x);CHKERRQ(ierr);
105*d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
106d132466eSBarry Smith   ierr = VecView(x,viewer);CHKERRQ(ierr);
107*d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
108d132466eSBarry Smith   PetscFunctionReturn(0);
109d132466eSBarry Smith }
110d132466eSBarry Smith 
1114a2ae208SSatish Balay #undef __FUNCT__
112a5c2985bSBarry Smith #define __FUNCT__ "KSPMonitorSNES"
113a5c2985bSBarry Smith /*@C
114a5c2985bSBarry Smith    KSPMonitorSNES - Print the residual norm of the nonlinear function at each iteration of the linear iterative solver.
115a5c2985bSBarry Smith 
116a5c2985bSBarry Smith    Collective on KSP
117a5c2985bSBarry Smith 
118a5c2985bSBarry Smith    Input Parameters:
119a5c2985bSBarry Smith +  ksp   - iterative context
120a5c2985bSBarry Smith .  n     - iteration number
121a5c2985bSBarry Smith .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
122a5c2985bSBarry Smith -  dummy - unused monitor context
123a5c2985bSBarry Smith 
124a5c2985bSBarry Smith    Level: intermediate
125a5c2985bSBarry Smith 
126a5c2985bSBarry Smith .keywords: KSP, default, monitor, residual
127a5c2985bSBarry Smith 
128a5c2985bSBarry Smith .seealso: KSPMonitorSet(), KSPMonitorTrueResidualNorm(), KSPMonitorLGResidualNormCreate()
129a5c2985bSBarry Smith @*/
130a5c2985bSBarry Smith PetscErrorCode  KSPMonitorSNES(KSP ksp,PetscInt n,PetscReal rnorm,void *dummy)
131a5c2985bSBarry Smith {
132a5c2985bSBarry Smith   PetscErrorCode ierr;
133a5c2985bSBarry Smith   PetscViewer    viewer;
134a5c2985bSBarry Smith   SNES           snes = (SNES) dummy;
135a5c2985bSBarry Smith   Vec            snes_solution,work1,work2;
136a5c2985bSBarry Smith   PetscReal      snorm;
137a5c2985bSBarry Smith 
138a5c2985bSBarry Smith   PetscFunctionBegin;
139a5c2985bSBarry Smith   ierr = SNESGetSolution(snes,&snes_solution);CHKERRQ(ierr);
140a5c2985bSBarry Smith   ierr = VecDuplicate(snes_solution,&work1);CHKERRQ(ierr);
141a5c2985bSBarry Smith   ierr = VecDuplicate(snes_solution,&work2);CHKERRQ(ierr);
142a5c2985bSBarry Smith   ierr = KSPBuildSolution(ksp,work1,NULL);CHKERRQ(ierr);
143a5c2985bSBarry Smith   ierr = VecAYPX(work1,-1.0,snes_solution);CHKERRQ(ierr);
144a5c2985bSBarry Smith   ierr = SNESComputeFunction(snes,work1,work2);CHKERRQ(ierr);
145a5c2985bSBarry Smith   ierr = VecNorm(work2,NORM_2,&snorm);CHKERRQ(ierr);
146a5c2985bSBarry Smith   ierr = VecDestroy(&work1);CHKERRQ(ierr);
147a5c2985bSBarry Smith   ierr = VecDestroy(&work2);CHKERRQ(ierr);
148a5c2985bSBarry Smith 
149a5c2985bSBarry Smith   ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ksp),&viewer);CHKERRQ(ierr);
150a5c2985bSBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr);
151a5c2985bSBarry Smith   if (n == 0 && ((PetscObject)ksp)->prefix) {
152a5c2985bSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  Residual norms for %s solve.\n",((PetscObject)ksp)->prefix);CHKERRQ(ierr);
153a5c2985bSBarry Smith   }
154a5c2985bSBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Residual norm %5.3e KSP Residual norm %5.3e \n",n,(double)snorm,(double)rnorm);CHKERRQ(ierr);
155a5c2985bSBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr);
156a5c2985bSBarry Smith   PetscFunctionReturn(0);
157a5c2985bSBarry Smith }
158a5c2985bSBarry Smith 
159e5f7ee39SBarry Smith #include <petscdraw.h>
160e5f7ee39SBarry Smith 
161e5f7ee39SBarry Smith #undef __FUNCT__
162e5f7ee39SBarry Smith #define __FUNCT__ "KSPMonitorSNESLGResidualNormCreate"
163e5f7ee39SBarry Smith /*@C
164e5f7ee39SBarry Smith    KSPMonitorSNESLGResidualNormCreate - Creates a line graph context for use with
165e5f7ee39SBarry Smith    KSP to monitor convergence of preconditioned residual norms.
166e5f7ee39SBarry Smith 
167e5f7ee39SBarry Smith    Collective on KSP
168e5f7ee39SBarry Smith 
169e5f7ee39SBarry Smith    Input Parameters:
1708b0b5a47SLisandro Dalcin +  comm - communicator context
1718b0b5a47SLisandro Dalcin .  host - the X display to open, or null for the local machine
172e5f7ee39SBarry Smith .  label - the title to put in the title bar
173e5f7ee39SBarry Smith .  x, y - the screen coordinates of the upper left coordinate of
174e5f7ee39SBarry Smith           the window
175e5f7ee39SBarry Smith -  m, n - the screen width and height in pixels
176e5f7ee39SBarry Smith 
177e5f7ee39SBarry Smith    Output Parameter:
178e5f7ee39SBarry Smith .  draw - the drawing context
179e5f7ee39SBarry Smith 
180e5f7ee39SBarry Smith    Options Database Key:
181e5f7ee39SBarry Smith .  -ksp_monitor_lg_residualnorm - Sets line graph monitor
182e5f7ee39SBarry Smith 
183e5f7ee39SBarry Smith    Notes:
184e5f7ee39SBarry Smith    Use KSPMonitorSNESLGResidualNormDestroy() to destroy this line graph; do not use PetscDrawLGDestroy().
185e5f7ee39SBarry Smith 
186e5f7ee39SBarry Smith    Level: intermediate
187e5f7ee39SBarry Smith 
188e5f7ee39SBarry Smith .keywords: KSP, monitor, line graph, residual, create
189e5f7ee39SBarry Smith 
190e5f7ee39SBarry Smith .seealso: KSPMonitorSNESLGResidualNormDestroy(), KSPMonitorSet(), KSPMonitorSNESLGTrueResidualCreate()
191e5f7ee39SBarry Smith @*/
1928b0b5a47SLisandro Dalcin PetscErrorCode  KSPMonitorSNESLGResidualNormCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscObject **objs)
193e5f7ee39SBarry Smith {
194e5f7ee39SBarry Smith   PetscDraw      draw;
195e5f7ee39SBarry Smith   PetscErrorCode ierr;
196e5f7ee39SBarry Smith   PetscDrawAxis  axis;
197c36cb520SLisandro Dalcin   PetscDrawLG    lg;
198e5f7ee39SBarry Smith   const char     *names[] = {"Linear residual","Nonlinear residual"};
199e5f7ee39SBarry Smith 
200e5f7ee39SBarry Smith   PetscFunctionBegin;
2018b0b5a47SLisandro Dalcin   ierr = PetscDrawCreate(comm,host,label,x,y,m,n,&draw);CHKERRQ(ierr);
202e5f7ee39SBarry Smith   ierr = PetscDrawSetFromOptions(draw);CHKERRQ(ierr);
203c36cb520SLisandro Dalcin   ierr = PetscDrawLGCreate(draw,2,&lg);CHKERRQ(ierr);
204c36cb520SLisandro Dalcin   ierr = PetscDrawLGSetLegend(lg,names);CHKERRQ(ierr);
205c36cb520SLisandro Dalcin   ierr = PetscDrawLGSetFromOptions(lg);CHKERRQ(ierr);
206c36cb520SLisandro Dalcin   ierr = PetscDrawLGGetAxis(lg,&axis);CHKERRQ(ierr);
207e5f7ee39SBarry Smith   ierr = PetscDrawAxisSetLabels(axis,"Convergence of Residual Norm","Iteration","Residual Norm");CHKERRQ(ierr);
208c36cb520SLisandro Dalcin   ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr);
209e5f7ee39SBarry Smith 
210c36cb520SLisandro Dalcin   ierr = PetscMalloc1(2,objs);CHKERRQ(ierr);
211c36cb520SLisandro Dalcin   (*objs)[1] = (PetscObject)lg;
212e5f7ee39SBarry Smith   PetscFunctionReturn(0);
213e5f7ee39SBarry Smith }
214e5f7ee39SBarry Smith 
215e5f7ee39SBarry Smith #undef __FUNCT__
216e5f7ee39SBarry Smith #define __FUNCT__ "KSPMonitorSNESLGResidualNorm"
217e5f7ee39SBarry Smith PetscErrorCode  KSPMonitorSNESLGResidualNorm(KSP ksp,PetscInt n,PetscReal rnorm,PetscObject *objs)
218e5f7ee39SBarry Smith {
219c36cb520SLisandro Dalcin   SNES           snes = (SNES) objs[0];
220e5f7ee39SBarry Smith   PetscDrawLG    lg   = (PetscDrawLG) objs[1];
221e5f7ee39SBarry Smith   PetscErrorCode ierr;
222e5f7ee39SBarry Smith   PetscReal      y[2];
223e5f7ee39SBarry Smith   Vec            snes_solution,work1,work2;
224e5f7ee39SBarry Smith 
225e5f7ee39SBarry Smith   PetscFunctionBegin;
226e5f7ee39SBarry Smith   if (rnorm > 0.0) y[0] = PetscLog10Real(rnorm);
227e5f7ee39SBarry Smith   else y[0] = -15.0;
228e5f7ee39SBarry Smith 
229e5f7ee39SBarry Smith   ierr = SNESGetSolution(snes,&snes_solution);CHKERRQ(ierr);
230e5f7ee39SBarry Smith   ierr = VecDuplicate(snes_solution,&work1);CHKERRQ(ierr);
231e5f7ee39SBarry Smith   ierr = VecDuplicate(snes_solution,&work2);CHKERRQ(ierr);
232e5f7ee39SBarry Smith   ierr = KSPBuildSolution(ksp,work1,NULL);CHKERRQ(ierr);
233e5f7ee39SBarry Smith   ierr = VecAYPX(work1,-1.0,snes_solution);CHKERRQ(ierr);
234e5f7ee39SBarry Smith   ierr = SNESComputeFunction(snes,work1,work2);CHKERRQ(ierr);
235e5f7ee39SBarry Smith   ierr = VecNorm(work2,NORM_2,y+1);CHKERRQ(ierr);
236e5f7ee39SBarry Smith   if (y[1] > 0.0) y[1] = PetscLog10Real(y[1]);
237e5f7ee39SBarry Smith   else y[1] = -15.0;
238e5f7ee39SBarry Smith   ierr = VecDestroy(&work1);CHKERRQ(ierr);
239e5f7ee39SBarry Smith   ierr = VecDestroy(&work2);CHKERRQ(ierr);
240e5f7ee39SBarry Smith 
241e5f7ee39SBarry Smith   ierr = PetscDrawLGAddPoint(lg,NULL,y);CHKERRQ(ierr);
2426934998bSLisandro Dalcin   if (n < 20 || !(n % 5) || snes->reason) {
243e5f7ee39SBarry Smith     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
2446934998bSLisandro Dalcin     ierr = PetscDrawLGSave(lg);CHKERRQ(ierr);
245e5f7ee39SBarry Smith   }
246e5f7ee39SBarry Smith   PetscFunctionReturn(0);
247e5f7ee39SBarry Smith }
248e5f7ee39SBarry Smith 
249e5f7ee39SBarry Smith #undef __FUNCT__
250e5f7ee39SBarry Smith #define __FUNCT__ "KSPMonitorSNESLGResidualNormDestroy"
251e5f7ee39SBarry Smith /*@
252e5f7ee39SBarry Smith    KSPMonitorSNESLGResidualNormDestroy - Destroys a line graph context that was created
253e5f7ee39SBarry Smith    with KSPMonitorSNESLGResidualNormCreate().
254e5f7ee39SBarry Smith 
255e5f7ee39SBarry Smith    Collective on KSP
256e5f7ee39SBarry Smith 
257e5f7ee39SBarry Smith    Input Parameter:
258e5f7ee39SBarry Smith .  draw - the drawing context
259e5f7ee39SBarry Smith 
260e5f7ee39SBarry Smith    Level: intermediate
261e5f7ee39SBarry Smith 
262e5f7ee39SBarry Smith .keywords: KSP, monitor, line graph, destroy
263e5f7ee39SBarry Smith 
264e5f7ee39SBarry Smith .seealso: KSPMonitorSNESLGResidualNormCreate(), KSPMonitorSNESLGTrueResidualDestroy(), KSPMonitorSet()
265e5f7ee39SBarry Smith @*/
266e5f7ee39SBarry Smith PetscErrorCode  KSPMonitorSNESLGResidualNormDestroy(PetscObject **objs)
267e5f7ee39SBarry Smith {
268e5f7ee39SBarry Smith   PetscErrorCode ierr;
269c36cb520SLisandro Dalcin   PetscDrawLG    lg = (PetscDrawLG) (*objs)[1];
270e5f7ee39SBarry Smith 
271e5f7ee39SBarry Smith   PetscFunctionBegin;
272c36cb520SLisandro Dalcin   ierr = PetscDrawLGDestroy(&lg);CHKERRQ(ierr);
273e5f7ee39SBarry Smith   ierr = PetscFree(*objs);CHKERRQ(ierr);
274e5f7ee39SBarry Smith   PetscFunctionReturn(0);
275e5f7ee39SBarry Smith }
276e5f7ee39SBarry Smith 
277a5c2985bSBarry Smith #undef __FUNCT__
278a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorDefault"
2794b828684SBarry Smith /*@C
280a6570f20SBarry Smith    SNESMonitorDefault - Monitors progress of the SNES solvers (default).
281e7e93795SLois Curfman McInnes 
282c7afd0dbSLois Curfman McInnes    Collective on SNES
283c7afd0dbSLois Curfman McInnes 
284e7e93795SLois Curfman McInnes    Input Parameters:
285c7afd0dbSLois Curfman McInnes +  snes - the SNES context
286e7e93795SLois Curfman McInnes .  its - iteration number
2874b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
288*d43b4f6eSBarry Smith -  vf - viewer and format structure
289fee21e36SBarry Smith 
290e7e93795SLois Curfman McInnes    Notes:
2914b27c08aSLois Curfman McInnes    This routine prints the residual norm at each iteration.
292e7e93795SLois Curfman McInnes 
29336851e7fSLois Curfman McInnes    Level: intermediate
29436851e7fSLois Curfman McInnes 
295e7e93795SLois Curfman McInnes .keywords: SNES, nonlinear, default, monitor, norm
296e7e93795SLois Curfman McInnes 
297a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution()
298e7e93795SLois Curfman McInnes @*/
299*d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorDefault(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
300e7e93795SLois Curfman McInnes {
301dfbe8321SBarry Smith   PetscErrorCode ierr;
302*d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
303d132466eSBarry Smith 
3043a40ed3dSBarry Smith   PetscFunctionBegin;
3054d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
306*d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
307649052a6SBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
308649052a6SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e \n",its,(double)fgnorm);CHKERRQ(ierr);
309649052a6SBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
310*d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr) ;
3113a40ed3dSBarry Smith   PetscFunctionReturn(0);
312e7e93795SLois Curfman McInnes }
3133f1db9ecSBarry Smith 
314b271bb04SBarry Smith #undef __FUNCT__
3152e7541e6SPeter Brune #define __FUNCT__ "SNESMonitorJacUpdateSpectrum"
316*d43b4f6eSBarry Smith PetscErrorCode SNESMonitorJacUpdateSpectrum(SNES snes,PetscInt it,PetscReal fnorm,PetscViewerAndFormat *vf)
317a80ad3e0SBarry Smith {
318196da8b6SPeter Brune #if defined(PETSC_MISSING_LAPACK_GEEV)
319ce94432eSBarry Smith   SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_SUP,"GEEV - Lapack routine is unavailable\nNot able to provide eigen values.");
320196da8b6SPeter Brune #elif defined(PETSC_HAVE_ESSL)
321ce94432eSBarry Smith   SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_SUP,"GEEV - No support for ESSL Lapack Routines");
322196da8b6SPeter Brune #else
3232e7541e6SPeter Brune   Vec            X;
3242e7541e6SPeter Brune   Mat            J,dJ,dJdense;
3252e7541e6SPeter Brune   PetscErrorCode ierr;
326d1e9a80fSBarry Smith   PetscErrorCode (*func)(SNES,Vec,Mat,Mat,void*);
3272e7541e6SPeter Brune   PetscInt       n,i;
3282e7541e6SPeter Brune   PetscBLASInt   nb,lwork;
3292e7541e6SPeter Brune   PetscReal      *eigr,*eigi;
3302e7541e6SPeter Brune   PetscScalar    *work;
3312e7541e6SPeter Brune   PetscScalar    *a;
3322e7541e6SPeter Brune 
3332e7541e6SPeter Brune   PetscFunctionBegin;
3342e7541e6SPeter Brune   if (it == 0) PetscFunctionReturn(0);
3352e7541e6SPeter Brune   /* create the difference between the current update and the current jacobian */
3362e7541e6SPeter Brune   ierr = SNESGetSolution(snes,&X);CHKERRQ(ierr);
337d1e9a80fSBarry Smith   ierr = SNESGetJacobian(snes,NULL,&J,&func,NULL);CHKERRQ(ierr);
3382e7541e6SPeter Brune   ierr = MatDuplicate(J,MAT_COPY_VALUES,&dJ);CHKERRQ(ierr);
339d1e9a80fSBarry Smith   ierr = SNESComputeJacobian(snes,X,dJ,dJ);CHKERRQ(ierr);
3402e7541e6SPeter Brune   ierr = MatAXPY(dJ,-1.0,J,SAME_NONZERO_PATTERN);CHKERRQ(ierr);
341f5af7f23SKarl Rupp 
3422e7541e6SPeter Brune   /* compute the spectrum directly */
3432e7541e6SPeter Brune   ierr  = MatConvert(dJ,MATSEQDENSE,MAT_INITIAL_MATRIX,&dJdense);CHKERRQ(ierr);
3440298fd71SBarry Smith   ierr  = MatGetSize(dJ,&n,NULL);CHKERRQ(ierr);
345c5df96a5SBarry Smith   ierr  = PetscBLASIntCast(n,&nb);CHKERRQ(ierr);
3462e7541e6SPeter Brune   lwork = 3*nb;
347785e854fSJed Brown   ierr  = PetscMalloc1(n,&eigr);CHKERRQ(ierr);
348785e854fSJed Brown   ierr  = PetscMalloc1(n,&eigi);CHKERRQ(ierr);
349785e854fSJed Brown   ierr  = PetscMalloc1(lwork,&work);CHKERRQ(ierr);
3508c778c55SBarry Smith   ierr  = MatDenseGetArray(dJdense,&a);CHKERRQ(ierr);
3512e7541e6SPeter Brune #if !defined(PETSC_USE_COMPLEX)
3522e7541e6SPeter Brune   {
3532e7541e6SPeter Brune     PetscBLASInt lierr;
3542e7541e6SPeter Brune     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
3558b83055fSJed Brown     PetscStackCallBLAS("LAPACKgeev",LAPACKgeev_("N","N",&nb,a,&nb,eigr,eigi,NULL,&nb,NULL,&nb,work,&lwork,&lierr));
3562e7541e6SPeter Brune     if (lierr) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"geev() error %d",lierr);
3572e7541e6SPeter Brune     ierr = PetscFPTrapPop();CHKERRQ(ierr);
3582e7541e6SPeter Brune   }
3592e7541e6SPeter Brune #else
3602e7541e6SPeter Brune   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Not coded for complex");
3612e7541e6SPeter Brune #endif
362fde5950dSBarry Smith   ierr = PetscPrintf(PetscObjectComm((PetscObject)snes),"Eigenvalues of J_%d - J_%d:\n",it,it-1);CHKERRQ(ierr);
3632e7541e6SPeter Brune   for (i=0;i<n;i++) {
364fde5950dSBarry Smith     ierr = PetscPrintf(PetscObjectComm((PetscObject)snes),"%5d: %20.5g + %20.5gi\n",i,(double)eigr[i],(double)eigi[i]);CHKERRQ(ierr);
3652e7541e6SPeter Brune   }
3668c778c55SBarry Smith   ierr = MatDenseRestoreArray(dJdense,&a);CHKERRQ(ierr);
3672e7541e6SPeter Brune   ierr = MatDestroy(&dJ);CHKERRQ(ierr);
3682e7541e6SPeter Brune   ierr = MatDestroy(&dJdense);CHKERRQ(ierr);
3692e7541e6SPeter Brune   ierr = PetscFree(eigr);CHKERRQ(ierr);
3702e7541e6SPeter Brune   ierr = PetscFree(eigi);CHKERRQ(ierr);
3712e7541e6SPeter Brune   ierr = PetscFree(work);CHKERRQ(ierr);
3722e7541e6SPeter Brune   PetscFunctionReturn(0);
373196da8b6SPeter Brune #endif
3742e7541e6SPeter Brune }
3752e7541e6SPeter Brune 
3762e7541e6SPeter Brune #undef __FUNCT__
377b271bb04SBarry Smith #define __FUNCT__ "SNESMonitorRange_Private"
3787087cfbeSBarry Smith PetscErrorCode  SNESMonitorRange_Private(SNES snes,PetscInt it,PetscReal *per)
379b271bb04SBarry Smith {
380b271bb04SBarry Smith   PetscErrorCode ierr;
381b271bb04SBarry Smith   Vec            resid;
382b271bb04SBarry Smith   PetscReal      rmax,pwork;
383b271bb04SBarry Smith   PetscInt       i,n,N;
384b271bb04SBarry Smith   PetscScalar    *r;
385b271bb04SBarry Smith 
386b271bb04SBarry Smith   PetscFunctionBegin;
387b271bb04SBarry Smith   ierr  = SNESGetFunction(snes,&resid,0,0);CHKERRQ(ierr);
388b271bb04SBarry Smith   ierr  = VecNorm(resid,NORM_INFINITY,&rmax);CHKERRQ(ierr);
389b271bb04SBarry Smith   ierr  = VecGetLocalSize(resid,&n);CHKERRQ(ierr);
390b271bb04SBarry Smith   ierr  = VecGetSize(resid,&N);CHKERRQ(ierr);
391b271bb04SBarry Smith   ierr  = VecGetArray(resid,&r);CHKERRQ(ierr);
392b271bb04SBarry Smith   pwork = 0.0;
393b271bb04SBarry Smith   for (i=0; i<n; i++) {
394b271bb04SBarry Smith     pwork += (PetscAbsScalar(r[i]) > .20*rmax);
395b271bb04SBarry Smith   }
396b2566f29SBarry Smith   ierr = MPIU_Allreduce(&pwork,per,1,MPIU_REAL,MPIU_SUM,PetscObjectComm((PetscObject)snes));CHKERRQ(ierr);
397b271bb04SBarry Smith   ierr = VecRestoreArray(resid,&r);CHKERRQ(ierr);
398b271bb04SBarry Smith   *per = *per/N;
399b271bb04SBarry Smith   PetscFunctionReturn(0);
400b271bb04SBarry Smith }
401b271bb04SBarry Smith 
402b271bb04SBarry Smith #undef __FUNCT__
403b271bb04SBarry Smith #define __FUNCT__ "SNESMonitorRange"
404b271bb04SBarry Smith /*@C
405b271bb04SBarry Smith    SNESMonitorRange - Prints the percentage of residual elements that are more then 10 percent of the maximum value.
406b271bb04SBarry Smith 
407b271bb04SBarry Smith    Collective on SNES
408b271bb04SBarry Smith 
409b271bb04SBarry Smith    Input Parameters:
410b271bb04SBarry Smith +  snes   - iterative context
411b271bb04SBarry Smith .  it    - iteration number
412b271bb04SBarry Smith .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
413b271bb04SBarry Smith -  dummy - unused monitor context
414b271bb04SBarry Smith 
415b271bb04SBarry Smith    Options Database Key:
416b271bb04SBarry Smith .  -snes_monitor_range - Activates SNESMonitorRange()
417b271bb04SBarry Smith 
418b271bb04SBarry Smith    Level: intermediate
419b271bb04SBarry Smith 
420b271bb04SBarry Smith .keywords: SNES, default, monitor, residual
421b271bb04SBarry Smith 
422b271bb04SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), SNESMonitorLGCreate()
423b271bb04SBarry Smith @*/
424*d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorRange(SNES snes,PetscInt it,PetscReal rnorm,PetscViewerAndFormat *vf)
425b271bb04SBarry Smith {
426b271bb04SBarry Smith   PetscErrorCode ierr;
427b271bb04SBarry Smith   PetscReal      perc,rel;
428*d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
429b271bb04SBarry Smith   /* should be in a MonitorRangeContext */
430b271bb04SBarry Smith   static PetscReal prev;
431b271bb04SBarry Smith 
432b271bb04SBarry Smith   PetscFunctionBegin;
4334d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
434b271bb04SBarry Smith   if (!it) prev = rnorm;
435b271bb04SBarry Smith   ierr = SNESMonitorRange_Private(snes,it,&perc);CHKERRQ(ierr);
436b271bb04SBarry Smith 
437b271bb04SBarry Smith   rel  = (prev - rnorm)/prev;
438b271bb04SBarry Smith   prev = rnorm;
439*d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
440649052a6SBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
4416712e2f1SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES preconditioned resid norm %14.12e Percent values above 20 percent of maximum %5.2f relative decrease %5.2e ratio %5.2e \n",it,(double)rnorm,(double)(100.0*perc),(double)rel,(double)(rel/perc));CHKERRQ(ierr);
442649052a6SBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
443*d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
444b271bb04SBarry Smith   PetscFunctionReturn(0);
445b271bb04SBarry Smith }
446b271bb04SBarry Smith 
4473a7fca6bSBarry Smith #undef __FUNCT__
448a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorRatio"
4493a7fca6bSBarry Smith /*@C
450a6570f20SBarry Smith    SNESMonitorRatio - Monitors progress of the SNES solvers by printing the ratio
4514b27c08aSLois Curfman McInnes    of residual norm at each iteration to the previous.
4523a7fca6bSBarry Smith 
4533a7fca6bSBarry Smith    Collective on SNES
4543a7fca6bSBarry Smith 
4553a7fca6bSBarry Smith    Input Parameters:
4563a7fca6bSBarry Smith +  snes - the SNES context
4573a7fca6bSBarry Smith .  its - iteration number
4583a7fca6bSBarry Smith .  fgnorm - 2-norm of residual (or gradient)
459eabae89aSBarry Smith -  dummy -  context of monitor
4603a7fca6bSBarry Smith 
4613a7fca6bSBarry Smith    Level: intermediate
4623a7fca6bSBarry Smith 
463fde5950dSBarry Smith    Notes: Insure that SNESMonitorRatio() is called when you set this monitor
4643a7fca6bSBarry Smith .keywords: SNES, nonlinear, monitor, norm
4653a7fca6bSBarry Smith 
466fde5950dSBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorRatio()
4673a7fca6bSBarry Smith @*/
468*d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorRatio(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
4693a7fca6bSBarry Smith {
470dfbe8321SBarry Smith   PetscErrorCode          ierr;
47177431f27SBarry Smith   PetscInt                len;
47287828ca2SBarry Smith   PetscReal               *history;
473*d43b4f6eSBarry Smith   PetscViewer             viewer = vf->viewer;
4743a7fca6bSBarry Smith 
4753a7fca6bSBarry Smith   PetscFunctionBegin;
4760298fd71SBarry Smith   ierr = SNESGetConvergenceHistory(snes,&history,NULL,&len);CHKERRQ(ierr);
477*d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
478fde5950dSBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
479958c9bccSBarry Smith   if (!its || !history || its > len) {
480fde5950dSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e \n",its,(double)fgnorm);CHKERRQ(ierr);
4813a7fca6bSBarry Smith   } else {
48287828ca2SBarry Smith     PetscReal ratio = fgnorm/history[its-1];
483fde5950dSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e %14.12e \n",its,(double)fgnorm,(double)ratio);CHKERRQ(ierr);
4843a7fca6bSBarry Smith   }
485fde5950dSBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
486*d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
4873a7fca6bSBarry Smith   PetscFunctionReturn(0);
4883a7fca6bSBarry Smith }
4893a7fca6bSBarry Smith 
4903a7fca6bSBarry Smith #undef __FUNCT__
491fde5950dSBarry Smith #define __FUNCT__ "SNESMonitorRatioSetUp"
4923a7fca6bSBarry Smith /*@C
493fde5950dSBarry Smith    SNESMonitorRatioSetUp - Insures the SNES object is saving its history since this monitor needs access to it
4943a7fca6bSBarry Smith 
4953a7fca6bSBarry Smith    Collective on SNES
4963a7fca6bSBarry Smith 
4973a7fca6bSBarry Smith    Input Parameters:
498eabae89aSBarry Smith +   snes - the SNES context
499fde5950dSBarry Smith -   viewer - the PetscViewer object (ignored)
5003a7fca6bSBarry Smith 
5013a7fca6bSBarry Smith    Level: intermediate
5023a7fca6bSBarry Smith 
5033a7fca6bSBarry Smith .keywords: SNES, nonlinear, monitor, norm
5043a7fca6bSBarry Smith 
505fde5950dSBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault(), SNESMonitorRatio()
5063a7fca6bSBarry Smith @*/
507*d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorRatioSetUp(SNES snes,PetscViewerAndFormat *vf)
5083a7fca6bSBarry Smith {
509dfbe8321SBarry Smith   PetscErrorCode          ierr;
51087828ca2SBarry Smith   PetscReal               *history;
5113a7fca6bSBarry Smith 
5123a7fca6bSBarry Smith   PetscFunctionBegin;
5130298fd71SBarry Smith   ierr = SNESGetConvergenceHistory(snes,&history,NULL,NULL);CHKERRQ(ierr);
5143a7fca6bSBarry Smith   if (!history) {
515fde5950dSBarry Smith     ierr = SNESSetConvergenceHistory(snes,NULL,NULL,100,PETSC_TRUE);CHKERRQ(ierr);
5163a7fca6bSBarry Smith   }
5173a7fca6bSBarry Smith   PetscFunctionReturn(0);
5183a7fca6bSBarry Smith }
5193a7fca6bSBarry Smith 
520e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */
5214a2ae208SSatish Balay #undef __FUNCT__
522a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorDefaultShort"
523be1f7002SBarry Smith /*
524a6570f20SBarry Smith      Default (short) SNES Monitor, same as SNESMonitorDefault() except
525be1f7002SBarry Smith   it prints fewer digits of the residual as the residual gets smaller.
526be1f7002SBarry Smith   This is because the later digits are meaningless and are often
527be1f7002SBarry Smith   different on different machines; by using this routine different
528be1f7002SBarry Smith   machines will usually generate the same output.
529be1f7002SBarry Smith */
530*d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorDefaultShort(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
531e7e93795SLois Curfman McInnes {
532dfbe8321SBarry Smith   PetscErrorCode ierr;
533*d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
534d132466eSBarry Smith 
5353a40ed3dSBarry Smith   PetscFunctionBegin;
5364d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
537*d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
538649052a6SBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
5398f240d10SBarry Smith   if (fgnorm > 1.e-9) {
5408fa295daSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %g \n",its,(double)fgnorm);CHKERRQ(ierr);
5413a40ed3dSBarry Smith   } else if (fgnorm > 1.e-11) {
5428fa295daSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %5.3e \n",its,(double)fgnorm);CHKERRQ(ierr);
5433a40ed3dSBarry Smith   } else {
544649052a6SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm < 1.e-11\n",its);CHKERRQ(ierr);
545a34d58ebSBarry Smith   }
546649052a6SBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
547*d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
5483a40ed3dSBarry Smith   PetscFunctionReturn(0);
549e7e93795SLois Curfman McInnes }
5502db13446SMatthew G. Knepley 
5512db13446SMatthew G. Knepley #undef __FUNCT__
5522db13446SMatthew G. Knepley #define __FUNCT__ "SNESMonitorDefaultField"
5532db13446SMatthew G. Knepley /*@C
5542db13446SMatthew G. Knepley   SNESMonitorDefaultField - Monitors progress of the SNES solvers, separated into fields.
5552db13446SMatthew G. Knepley 
5562db13446SMatthew G. Knepley   Collective on SNES
5572db13446SMatthew G. Knepley 
5582db13446SMatthew G. Knepley   Input Parameters:
5592db13446SMatthew G. Knepley + snes   - the SNES context
5602db13446SMatthew G. Knepley . its    - iteration number
5612db13446SMatthew G. Knepley . fgnorm - 2-norm of residual
5622db13446SMatthew G. Knepley - ctx    - the PetscViewer
5632db13446SMatthew G. Knepley 
5642db13446SMatthew G. Knepley   Notes:
5652db13446SMatthew G. Knepley   This routine uses the DM attached to the residual vector
5662db13446SMatthew G. Knepley 
5672db13446SMatthew G. Knepley   Level: intermediate
5682db13446SMatthew G. Knepley 
5692db13446SMatthew G. Knepley .keywords: SNES, nonlinear, field, monitor, norm
5702db13446SMatthew G. Knepley .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault(), SNESMonitorDefaultShort()
5712db13446SMatthew G. Knepley @*/
572*d43b4f6eSBarry Smith PetscErrorCode SNESMonitorDefaultField(SNES snes, PetscInt its, PetscReal fgnorm, PetscViewerAndFormat *vf)
5732db13446SMatthew G. Knepley {
574*d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
5752db13446SMatthew G. Knepley   Vec            r;
5762db13446SMatthew G. Knepley   DM             dm;
5772db13446SMatthew G. Knepley   PetscReal      res[256];
5782db13446SMatthew G. Knepley   PetscInt       tablevel;
5792db13446SMatthew G. Knepley   PetscErrorCode ierr;
5802db13446SMatthew G. Knepley 
5812db13446SMatthew G. Knepley   PetscFunctionBegin;
5824d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
5832db13446SMatthew G. Knepley   ierr = SNESGetFunction(snes, &r, NULL, NULL);CHKERRQ(ierr);
5842db13446SMatthew G. Knepley   ierr = VecGetDM(r, &dm);CHKERRQ(ierr);
585*d43b4f6eSBarry Smith   if (!dm) {ierr = SNESMonitorDefault(snes, its, fgnorm, vf);CHKERRQ(ierr);}
5862db13446SMatthew G. Knepley   else {
5872db13446SMatthew G. Knepley     PetscSection s, gs;
5882db13446SMatthew G. Knepley     PetscInt     Nf, f;
5892db13446SMatthew G. Knepley 
5902db13446SMatthew G. Knepley     ierr = DMGetDefaultSection(dm, &s);CHKERRQ(ierr);
5912db13446SMatthew G. Knepley     ierr = DMGetDefaultGlobalSection(dm, &gs);CHKERRQ(ierr);
592*d43b4f6eSBarry Smith     if (!s || !gs) {ierr = SNESMonitorDefault(snes, its, fgnorm, vf);CHKERRQ(ierr);}
5932db13446SMatthew G. Knepley     ierr = PetscSectionGetNumFields(s, &Nf);CHKERRQ(ierr);
5942db13446SMatthew G. Knepley     if (Nf > 256) SETERRQ1(PetscObjectComm((PetscObject) snes), PETSC_ERR_SUP, "Do not support %d fields > 256", Nf);
5952db13446SMatthew G. Knepley     ierr = PetscSectionVecNorm(s, gs, r, NORM_2, res);CHKERRQ(ierr);
5962db13446SMatthew G. Knepley     ierr = PetscObjectGetTabLevel((PetscObject) snes, &tablevel);CHKERRQ(ierr);
597*d43b4f6eSBarry Smith     ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
5982db13446SMatthew G. Knepley     ierr = PetscViewerASCIIAddTab(viewer, tablevel);CHKERRQ(ierr);
5992db13446SMatthew G. Knepley     ierr = PetscViewerASCIIPrintf(viewer, "%3D SNES Function norm %14.12e [", its, (double) fgnorm);CHKERRQ(ierr);
6002db13446SMatthew G. Knepley     for (f = 0; f < Nf; ++f) {
6012db13446SMatthew G. Knepley       if (f) {ierr = PetscViewerASCIIPrintf(viewer, ", ");CHKERRQ(ierr);}
6022db13446SMatthew G. Knepley       ierr = PetscViewerASCIIPrintf(viewer, "%14.12e", res[f]);CHKERRQ(ierr);
6032db13446SMatthew G. Knepley     }
6042db13446SMatthew G. Knepley     ierr = PetscViewerASCIIPrintf(viewer, "] \n");CHKERRQ(ierr);
6052db13446SMatthew G. Knepley     ierr = PetscViewerASCIISubtractTab(viewer, tablevel);CHKERRQ(ierr);
606*d43b4f6eSBarry Smith     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
6072db13446SMatthew G. Knepley   }
6082db13446SMatthew G. Knepley   PetscFunctionReturn(0);
6092db13446SMatthew G. Knepley }
610e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */
6114a2ae208SSatish Balay #undef __FUNCT__
6128d359177SBarry Smith #define __FUNCT__ "SNESConvergedDefault"
6134b828684SBarry Smith /*@C
6148d359177SBarry Smith    SNESConvergedDefault - Convergence test of the solvers for
615f525115eSLois Curfman McInnes    systems of nonlinear equations (default).
616e7e93795SLois Curfman McInnes 
617c7afd0dbSLois Curfman McInnes    Collective on SNES
618c7afd0dbSLois Curfman McInnes 
619e7e93795SLois Curfman McInnes    Input Parameters:
620c7afd0dbSLois Curfman McInnes +  snes - the SNES context
62106ee9f85SBarry Smith .  it - the iteration (0 indicates before any Newton steps)
622e7e93795SLois Curfman McInnes .  xnorm - 2-norm of current iterate
623c60f73f4SPeter Brune .  snorm - 2-norm of current step
6247f3332b4SBarry Smith .  fnorm - 2-norm of function at current iterate
625c7afd0dbSLois Curfman McInnes -  dummy - unused context
626e7e93795SLois Curfman McInnes 
627184914b5SBarry Smith    Output Parameter:
628184914b5SBarry Smith .   reason  - one of
62970441072SBarry Smith $  SNES_CONVERGED_FNORM_ABS       - (fnorm < abstol),
630c60f73f4SPeter Brune $  SNES_CONVERGED_SNORM_RELATIVE  - (snorm < stol*xnorm),
631184914b5SBarry Smith $  SNES_CONVERGED_FNORM_RELATIVE  - (fnorm < rtol*fnorm0),
632184914b5SBarry Smith $  SNES_DIVERGED_FUNCTION_COUNT   - (nfct > maxf),
633184914b5SBarry Smith $  SNES_DIVERGED_FNORM_NAN        - (fnorm == NaN),
634184914b5SBarry Smith $  SNES_CONVERGED_ITERATING       - (otherwise),
635e7e93795SLois Curfman McInnes 
636e7e93795SLois Curfman McInnes    where
637c7afd0dbSLois Curfman McInnes +    maxf - maximum number of function evaluations,
638c7afd0dbSLois Curfman McInnes             set with SNESSetTolerances()
639c7afd0dbSLois Curfman McInnes .    nfct - number of function evaluations,
64070441072SBarry Smith .    abstol - absolute function norm tolerance,
641c7afd0dbSLois Curfman McInnes             set with SNESSetTolerances()
642c7afd0dbSLois Curfman McInnes -    rtol - relative function norm tolerance, set with SNESSetTolerances()
643fee21e36SBarry Smith 
64436851e7fSLois Curfman McInnes    Level: intermediate
64536851e7fSLois Curfman McInnes 
646e7e93795SLois Curfman McInnes .keywords: SNES, nonlinear, default, converged, convergence
647e7e93795SLois Curfman McInnes 
64871f87433Sdalcinl .seealso: SNESSetConvergenceTest()
649e7e93795SLois Curfman McInnes @*/
6508d359177SBarry Smith PetscErrorCode  SNESConvergedDefault(SNES snes,PetscInt it,PetscReal xnorm,PetscReal snorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy)
651e7e93795SLois Curfman McInnes {
65263ba0a88SBarry Smith   PetscErrorCode ierr;
65363ba0a88SBarry Smith 
6543a40ed3dSBarry Smith   PetscFunctionBegin;
6550700a824SBarry Smith   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
6563f149594SLisandro Dalcin   PetscValidPointer(reason,6);
6573f149594SLisandro Dalcin 
65806ee9f85SBarry Smith   *reason = SNES_CONVERGED_ITERATING;
65906ee9f85SBarry Smith 
66006ee9f85SBarry Smith   if (!it) {
66106ee9f85SBarry Smith     /* set parameter for default relative tolerance convergence test */
66206ee9f85SBarry Smith     snes->ttol = fnorm*snes->rtol;
66306ee9f85SBarry Smith   }
6648146f6ebSBarry Smith   if (PetscIsInfOrNanReal(fnorm)) {
665ae15b995SBarry Smith     ierr    = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr);
666184914b5SBarry Smith     *reason = SNES_DIVERGED_FNORM_NAN;
66770441072SBarry Smith   } else if (fnorm < snes->abstol) {
6688f1a2a5eSBarry Smith     ierr    = PetscInfo2(snes,"Converged due to function norm %14.12e < %14.12e\n",(double)fnorm,(double)snes->abstol);CHKERRQ(ierr);
669184914b5SBarry Smith     *reason = SNES_CONVERGED_FNORM_ABS;
67043e71028SBarry Smith   } else if (snes->nfuncs >= snes->max_funcs) {
671ae15b995SBarry Smith     ierr    = PetscInfo2(snes,"Exceeded maximum number of function evaluations: %D > %D\n",snes->nfuncs,snes->max_funcs);CHKERRQ(ierr);
672184914b5SBarry Smith     *reason = SNES_DIVERGED_FUNCTION_COUNT;
67306ee9f85SBarry Smith   }
67406ee9f85SBarry Smith 
67506ee9f85SBarry Smith   if (it && !*reason) {
67606ee9f85SBarry Smith     if (fnorm <= snes->ttol) {
6778f1a2a5eSBarry Smith       ierr    = PetscInfo2(snes,"Converged due to function norm %14.12e < %14.12e (relative tolerance)\n",(double)fnorm,(double)snes->ttol);CHKERRQ(ierr);
67806ee9f85SBarry Smith       *reason = SNES_CONVERGED_FNORM_RELATIVE;
679c60f73f4SPeter Brune     } else if (snorm < snes->stol*xnorm) {
680c60f73f4SPeter Brune       ierr    = PetscInfo3(snes,"Converged due to small update length: %14.12e < %14.12e * %14.12e\n",(double)snorm,(double)snes->stol,(double)xnorm);CHKERRQ(ierr);
681c60f73f4SPeter Brune       *reason = SNES_CONVERGED_SNORM_RELATIVE;
68206ee9f85SBarry Smith     }
683e7e93795SLois Curfman McInnes   }
6843a40ed3dSBarry Smith   PetscFunctionReturn(0);
685e7e93795SLois Curfman McInnes }
6863f149594SLisandro Dalcin 
6873f149594SLisandro Dalcin #undef __FUNCT__
688e2a6519dSDmitry Karpeev #define __FUNCT__ "SNESConvergedSkip"
6893f149594SLisandro Dalcin /*@C
690e2a6519dSDmitry Karpeev    SNESConvergedSkip - Convergence test for SNES that NEVER returns as
6913f149594SLisandro Dalcin    converged, UNLESS the maximum number of iteration have been reached.
6923f149594SLisandro Dalcin 
6933f9fe445SBarry Smith    Logically Collective on SNES
6943f149594SLisandro Dalcin 
6953f149594SLisandro Dalcin    Input Parameters:
6963f149594SLisandro Dalcin +  snes - the SNES context
6973f149594SLisandro Dalcin .  it - the iteration (0 indicates before any Newton steps)
6983f149594SLisandro Dalcin .  xnorm - 2-norm of current iterate
699c60f73f4SPeter Brune .  snorm - 2-norm of current step
7003f149594SLisandro Dalcin .  fnorm - 2-norm of function at current iterate
7013f149594SLisandro Dalcin -  dummy - unused context
7023f149594SLisandro Dalcin 
7033f149594SLisandro Dalcin    Output Parameter:
70485385478SLisandro Dalcin .   reason  - SNES_CONVERGED_ITERATING, SNES_CONVERGED_ITS, or SNES_DIVERGED_FNORM_NAN
7053f149594SLisandro Dalcin 
7063f149594SLisandro Dalcin    Notes:
7073f149594SLisandro Dalcin    Convergence is then declared after a fixed number of iterations have been used.
7083f149594SLisandro Dalcin 
7093f149594SLisandro Dalcin    Level: advanced
7103f149594SLisandro Dalcin 
7113f149594SLisandro Dalcin .keywords: SNES, nonlinear, skip, converged, convergence
7123f149594SLisandro Dalcin 
7133f149594SLisandro Dalcin .seealso: SNESSetConvergenceTest()
7143f149594SLisandro Dalcin @*/
715e2a6519dSDmitry Karpeev PetscErrorCode  SNESConvergedSkip(SNES snes,PetscInt it,PetscReal xnorm,PetscReal snorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy)
7163f149594SLisandro Dalcin {
7173f149594SLisandro Dalcin   PetscErrorCode ierr;
7183f149594SLisandro Dalcin 
7193f149594SLisandro Dalcin   PetscFunctionBegin;
7200700a824SBarry Smith   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
7213f149594SLisandro Dalcin   PetscValidPointer(reason,6);
7223f149594SLisandro Dalcin 
7233f149594SLisandro Dalcin   *reason = SNES_CONVERGED_ITERATING;
7243f149594SLisandro Dalcin 
7253f149594SLisandro Dalcin   if (fnorm != fnorm) {
7263f149594SLisandro Dalcin     ierr    = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr);
7273f149594SLisandro Dalcin     *reason = SNES_DIVERGED_FNORM_NAN;
7283f149594SLisandro Dalcin   } else if (it == snes->max_its) {
7293f149594SLisandro Dalcin     *reason = SNES_CONVERGED_ITS;
7303f149594SLisandro Dalcin   }
7313f149594SLisandro Dalcin   PetscFunctionReturn(0);
7323f149594SLisandro Dalcin }
7333f149594SLisandro Dalcin 
73458c9b817SLisandro Dalcin #undef __FUNCT__
735fa0ddf94SBarry Smith #define __FUNCT__ "SNESSetWorkVecs"
7368d359177SBarry Smith /*@C
737fa0ddf94SBarry Smith   SNESSetWorkVecs - Gets a number of work vectors.
73858c9b817SLisandro Dalcin 
73958c9b817SLisandro Dalcin   Input Parameters:
74058c9b817SLisandro Dalcin . snes  - the SNES context
74158c9b817SLisandro Dalcin . nw - number of work vectors to allocate
74258c9b817SLisandro Dalcin 
74358c9b817SLisandro Dalcin    Level: developer
74458c9b817SLisandro Dalcin 
745fa0ddf94SBarry Smith    Developers Note: This is PETSC_EXTERN because it may be used by user written plugin SNES implementations
746fa0ddf94SBarry Smith 
74798acb6afSMatthew G Knepley @*/
748fa0ddf94SBarry Smith PetscErrorCode SNESSetWorkVecs(SNES snes,PetscInt nw)
74958c9b817SLisandro Dalcin {
750c5ed8070SMatthew G. Knepley   DM             dm;
751c5ed8070SMatthew G. Knepley   Vec            v;
75258c9b817SLisandro Dalcin   PetscErrorCode ierr;
75358c9b817SLisandro Dalcin 
75458c9b817SLisandro Dalcin   PetscFunctionBegin;
75558c9b817SLisandro Dalcin   if (snes->work) {ierr = VecDestroyVecs(snes->nwork,&snes->work);CHKERRQ(ierr);}
75658c9b817SLisandro Dalcin   snes->nwork = nw;
757f5af7f23SKarl Rupp 
758c5ed8070SMatthew G. Knepley   ierr = SNESGetDM(snes, &dm);CHKERRQ(ierr);
759c5ed8070SMatthew G. Knepley   ierr = DMGetGlobalVector(dm, &v);CHKERRQ(ierr);
760c5ed8070SMatthew G. Knepley   ierr = VecDuplicateVecs(v,snes->nwork,&snes->work);CHKERRQ(ierr);
761c5ed8070SMatthew G. Knepley   ierr = DMRestoreGlobalVector(dm, &v);CHKERRQ(ierr);
76258c9b817SLisandro Dalcin   ierr = PetscLogObjectParents(snes,nw,snes->work);CHKERRQ(ierr);
76358c9b817SLisandro Dalcin   PetscFunctionReturn(0);
76458c9b817SLisandro Dalcin }
765