xref: /petsc/src/snes/interface/snesut.c (revision ee32d87a9e5acdbd6bf298b9bac37d6f61876d18)
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 
20*ee32d87aSMatthew G. Knepley    Options Database Keys:
21*ee32d87aSMatthew G. Knepley .  -snes_monitor_solution [ascii binary draw][:filename][:viewer format] - plots solution at each iteration
22*ee32d87aSMatthew G. Knepley 
2336851e7fSLois Curfman McInnes    Level: intermediate
243f1db9ecSBarry Smith 
2536851e7fSLois Curfman McInnes .keywords: SNES, nonlinear, vector, monitor, view
263f1db9ecSBarry Smith 
27a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView()
283f1db9ecSBarry Smith @*/
29d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorSolution(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
303f1db9ecSBarry Smith {
31dfbe8321SBarry Smith   PetscErrorCode ierr;
323f1db9ecSBarry Smith   Vec            x;
33d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
343f1db9ecSBarry Smith 
353f1db9ecSBarry Smith   PetscFunctionBegin;
364d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
373f1db9ecSBarry Smith   ierr = SNESGetSolution(snes,&x);CHKERRQ(ierr);
38d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
393f1db9ecSBarry Smith   ierr = VecView(x,viewer);CHKERRQ(ierr);
40d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
413f1db9ecSBarry Smith   PetscFunctionReturn(0);
423f1db9ecSBarry Smith }
433f1db9ecSBarry Smith 
444a2ae208SSatish Balay #undef __FUNCT__
45a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorResidual"
465ed2d596SBarry Smith /*@C
47a6570f20SBarry Smith    SNESMonitorResidual - Monitors progress of the SNES solvers by calling
485ed2d596SBarry Smith    VecView() for the residual at each iteration.
495ed2d596SBarry Smith 
505ed2d596SBarry Smith    Collective on SNES
515ed2d596SBarry Smith 
525ed2d596SBarry Smith    Input Parameters:
535ed2d596SBarry Smith +  snes - the SNES context
545ed2d596SBarry Smith .  its - iteration number
554b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
56f55353a2SBarry Smith -  dummy -  a viewer
575ed2d596SBarry Smith 
58*ee32d87aSMatthew G. Knepley    Options Database Keys:
59*ee32d87aSMatthew G. Knepley .  -snes_monitor_residual [ascii binary draw][:filename][:viewer format] - plots residual (not its norm) at each iteration
60*ee32d87aSMatthew G. Knepley 
615ed2d596SBarry Smith    Level: intermediate
625ed2d596SBarry Smith 
635ed2d596SBarry Smith .keywords: SNES, nonlinear, vector, monitor, view
645ed2d596SBarry Smith 
65a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView()
665ed2d596SBarry Smith @*/
67d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorResidual(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
685ed2d596SBarry Smith {
69dfbe8321SBarry Smith   PetscErrorCode ierr;
705ed2d596SBarry Smith   Vec            x;
71d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
725ed2d596SBarry Smith 
735ed2d596SBarry Smith   PetscFunctionBegin;
744d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
755ed2d596SBarry Smith   ierr = SNESGetFunction(snes,&x,0,0);CHKERRQ(ierr);
76d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
775ed2d596SBarry Smith   ierr = VecView(x,viewer);CHKERRQ(ierr);
78d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
795ed2d596SBarry Smith   PetscFunctionReturn(0);
805ed2d596SBarry Smith }
815ed2d596SBarry Smith 
825ed2d596SBarry Smith #undef __FUNCT__
83a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorSolutionUpdate"
84d132466eSBarry Smith /*@C
85a6570f20SBarry Smith    SNESMonitorSolutionUpdate - Monitors progress of the SNES solvers by calling
86d132466eSBarry Smith    VecView() for the UPDATE to the solution at each iteration.
87d132466eSBarry Smith 
88d132466eSBarry Smith    Collective on SNES
89d132466eSBarry Smith 
90d132466eSBarry Smith    Input Parameters:
91d132466eSBarry Smith +  snes - the SNES context
92d132466eSBarry Smith .  its - iteration number
934b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
94f55353a2SBarry Smith -  dummy - a viewer
95d132466eSBarry Smith 
96*ee32d87aSMatthew G. Knepley    Options Database Keys:
97*ee32d87aSMatthew G. Knepley .  -snes_monitor_solution_update [ascii binary draw][:filename][:viewer format] - plots update to solution at each iteration
98*ee32d87aSMatthew G. Knepley 
99d132466eSBarry Smith    Level: intermediate
100d132466eSBarry Smith 
101d132466eSBarry Smith .keywords: SNES, nonlinear, vector, monitor, view
102d132466eSBarry Smith 
103a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView()
104d132466eSBarry Smith @*/
105d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorSolutionUpdate(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
106d132466eSBarry Smith {
107dfbe8321SBarry Smith   PetscErrorCode ierr;
108d132466eSBarry Smith   Vec            x;
109d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
110d132466eSBarry Smith 
111d132466eSBarry Smith   PetscFunctionBegin;
1124d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
113d132466eSBarry Smith   ierr = SNESGetSolutionUpdate(snes,&x);CHKERRQ(ierr);
114d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
115d132466eSBarry Smith   ierr = VecView(x,viewer);CHKERRQ(ierr);
116d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
117d132466eSBarry Smith   PetscFunctionReturn(0);
118d132466eSBarry Smith }
119d132466eSBarry Smith 
1204a2ae208SSatish Balay #undef __FUNCT__
121a5c2985bSBarry Smith #define __FUNCT__ "KSPMonitorSNES"
122a5c2985bSBarry Smith /*@C
123a5c2985bSBarry Smith    KSPMonitorSNES - Print the residual norm of the nonlinear function at each iteration of the linear iterative solver.
124a5c2985bSBarry Smith 
125a5c2985bSBarry Smith    Collective on KSP
126a5c2985bSBarry Smith 
127a5c2985bSBarry Smith    Input Parameters:
128a5c2985bSBarry Smith +  ksp   - iterative context
129a5c2985bSBarry Smith .  n     - iteration number
130a5c2985bSBarry Smith .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
131a5c2985bSBarry Smith -  dummy - unused monitor context
132a5c2985bSBarry Smith 
133a5c2985bSBarry Smith    Level: intermediate
134a5c2985bSBarry Smith 
135a5c2985bSBarry Smith .keywords: KSP, default, monitor, residual
136a5c2985bSBarry Smith 
137a5c2985bSBarry Smith .seealso: KSPMonitorSet(), KSPMonitorTrueResidualNorm(), KSPMonitorLGResidualNormCreate()
138a5c2985bSBarry Smith @*/
139a5c2985bSBarry Smith PetscErrorCode  KSPMonitorSNES(KSP ksp,PetscInt n,PetscReal rnorm,void *dummy)
140a5c2985bSBarry Smith {
141a5c2985bSBarry Smith   PetscErrorCode ierr;
142a5c2985bSBarry Smith   PetscViewer    viewer;
143a5c2985bSBarry Smith   SNES           snes = (SNES) dummy;
144a5c2985bSBarry Smith   Vec            snes_solution,work1,work2;
145a5c2985bSBarry Smith   PetscReal      snorm;
146a5c2985bSBarry Smith 
147a5c2985bSBarry Smith   PetscFunctionBegin;
148a5c2985bSBarry Smith   ierr = SNESGetSolution(snes,&snes_solution);CHKERRQ(ierr);
149a5c2985bSBarry Smith   ierr = VecDuplicate(snes_solution,&work1);CHKERRQ(ierr);
150a5c2985bSBarry Smith   ierr = VecDuplicate(snes_solution,&work2);CHKERRQ(ierr);
151a5c2985bSBarry Smith   ierr = KSPBuildSolution(ksp,work1,NULL);CHKERRQ(ierr);
152a5c2985bSBarry Smith   ierr = VecAYPX(work1,-1.0,snes_solution);CHKERRQ(ierr);
153a5c2985bSBarry Smith   ierr = SNESComputeFunction(snes,work1,work2);CHKERRQ(ierr);
154a5c2985bSBarry Smith   ierr = VecNorm(work2,NORM_2,&snorm);CHKERRQ(ierr);
155a5c2985bSBarry Smith   ierr = VecDestroy(&work1);CHKERRQ(ierr);
156a5c2985bSBarry Smith   ierr = VecDestroy(&work2);CHKERRQ(ierr);
157a5c2985bSBarry Smith 
158a5c2985bSBarry Smith   ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ksp),&viewer);CHKERRQ(ierr);
159a5c2985bSBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr);
160a5c2985bSBarry Smith   if (n == 0 && ((PetscObject)ksp)->prefix) {
161a5c2985bSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  Residual norms for %s solve.\n",((PetscObject)ksp)->prefix);CHKERRQ(ierr);
162a5c2985bSBarry Smith   }
163a5c2985bSBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Residual norm %5.3e KSP Residual norm %5.3e \n",n,(double)snorm,(double)rnorm);CHKERRQ(ierr);
164a5c2985bSBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr);
165a5c2985bSBarry Smith   PetscFunctionReturn(0);
166a5c2985bSBarry Smith }
167a5c2985bSBarry Smith 
168e5f7ee39SBarry Smith #include <petscdraw.h>
169e5f7ee39SBarry Smith 
170e5f7ee39SBarry Smith #undef __FUNCT__
171e5f7ee39SBarry Smith #define __FUNCT__ "KSPMonitorSNESLGResidualNormCreate"
172e5f7ee39SBarry Smith /*@C
173e5f7ee39SBarry Smith    KSPMonitorSNESLGResidualNormCreate - Creates a line graph context for use with
174e5f7ee39SBarry Smith    KSP to monitor convergence of preconditioned residual norms.
175e5f7ee39SBarry Smith 
176e5f7ee39SBarry Smith    Collective on KSP
177e5f7ee39SBarry Smith 
178e5f7ee39SBarry Smith    Input Parameters:
1798b0b5a47SLisandro Dalcin +  comm - communicator context
1808b0b5a47SLisandro Dalcin .  host - the X display to open, or null for the local machine
181e5f7ee39SBarry Smith .  label - the title to put in the title bar
182e5f7ee39SBarry Smith .  x, y - the screen coordinates of the upper left coordinate of
183e5f7ee39SBarry Smith           the window
184e5f7ee39SBarry Smith -  m, n - the screen width and height in pixels
185e5f7ee39SBarry Smith 
186e5f7ee39SBarry Smith    Output Parameter:
187e5f7ee39SBarry Smith .  draw - the drawing context
188e5f7ee39SBarry Smith 
189e5f7ee39SBarry Smith    Options Database Key:
190e5f7ee39SBarry Smith .  -ksp_monitor_lg_residualnorm - Sets line graph monitor
191e5f7ee39SBarry Smith 
192e5f7ee39SBarry Smith    Notes:
193e5f7ee39SBarry Smith    Use KSPMonitorSNESLGResidualNormDestroy() to destroy this line graph; do not use PetscDrawLGDestroy().
194e5f7ee39SBarry Smith 
195e5f7ee39SBarry Smith    Level: intermediate
196e5f7ee39SBarry Smith 
197e5f7ee39SBarry Smith .keywords: KSP, monitor, line graph, residual, create
198e5f7ee39SBarry Smith 
199e5f7ee39SBarry Smith .seealso: KSPMonitorSNESLGResidualNormDestroy(), KSPMonitorSet(), KSPMonitorSNESLGTrueResidualCreate()
200e5f7ee39SBarry Smith @*/
2018b0b5a47SLisandro Dalcin PetscErrorCode  KSPMonitorSNESLGResidualNormCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscObject **objs)
202e5f7ee39SBarry Smith {
203e5f7ee39SBarry Smith   PetscDraw      draw;
204e5f7ee39SBarry Smith   PetscErrorCode ierr;
205e5f7ee39SBarry Smith   PetscDrawAxis  axis;
206c36cb520SLisandro Dalcin   PetscDrawLG    lg;
207e5f7ee39SBarry Smith   const char     *names[] = {"Linear residual","Nonlinear residual"};
208e5f7ee39SBarry Smith 
209e5f7ee39SBarry Smith   PetscFunctionBegin;
2108b0b5a47SLisandro Dalcin   ierr = PetscDrawCreate(comm,host,label,x,y,m,n,&draw);CHKERRQ(ierr);
211e5f7ee39SBarry Smith   ierr = PetscDrawSetFromOptions(draw);CHKERRQ(ierr);
212c36cb520SLisandro Dalcin   ierr = PetscDrawLGCreate(draw,2,&lg);CHKERRQ(ierr);
213c36cb520SLisandro Dalcin   ierr = PetscDrawLGSetLegend(lg,names);CHKERRQ(ierr);
214c36cb520SLisandro Dalcin   ierr = PetscDrawLGSetFromOptions(lg);CHKERRQ(ierr);
215c36cb520SLisandro Dalcin   ierr = PetscDrawLGGetAxis(lg,&axis);CHKERRQ(ierr);
216e5f7ee39SBarry Smith   ierr = PetscDrawAxisSetLabels(axis,"Convergence of Residual Norm","Iteration","Residual Norm");CHKERRQ(ierr);
217c36cb520SLisandro Dalcin   ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr);
218e5f7ee39SBarry Smith 
219c36cb520SLisandro Dalcin   ierr = PetscMalloc1(2,objs);CHKERRQ(ierr);
220c36cb520SLisandro Dalcin   (*objs)[1] = (PetscObject)lg;
221e5f7ee39SBarry Smith   PetscFunctionReturn(0);
222e5f7ee39SBarry Smith }
223e5f7ee39SBarry Smith 
224e5f7ee39SBarry Smith #undef __FUNCT__
225e5f7ee39SBarry Smith #define __FUNCT__ "KSPMonitorSNESLGResidualNorm"
226e5f7ee39SBarry Smith PetscErrorCode  KSPMonitorSNESLGResidualNorm(KSP ksp,PetscInt n,PetscReal rnorm,PetscObject *objs)
227e5f7ee39SBarry Smith {
228c36cb520SLisandro Dalcin   SNES           snes = (SNES) objs[0];
229e5f7ee39SBarry Smith   PetscDrawLG    lg   = (PetscDrawLG) objs[1];
230e5f7ee39SBarry Smith   PetscErrorCode ierr;
231e5f7ee39SBarry Smith   PetscReal      y[2];
232e5f7ee39SBarry Smith   Vec            snes_solution,work1,work2;
233e5f7ee39SBarry Smith 
234e5f7ee39SBarry Smith   PetscFunctionBegin;
235e5f7ee39SBarry Smith   if (rnorm > 0.0) y[0] = PetscLog10Real(rnorm);
236e5f7ee39SBarry Smith   else y[0] = -15.0;
237e5f7ee39SBarry Smith 
238e5f7ee39SBarry Smith   ierr = SNESGetSolution(snes,&snes_solution);CHKERRQ(ierr);
239e5f7ee39SBarry Smith   ierr = VecDuplicate(snes_solution,&work1);CHKERRQ(ierr);
240e5f7ee39SBarry Smith   ierr = VecDuplicate(snes_solution,&work2);CHKERRQ(ierr);
241e5f7ee39SBarry Smith   ierr = KSPBuildSolution(ksp,work1,NULL);CHKERRQ(ierr);
242e5f7ee39SBarry Smith   ierr = VecAYPX(work1,-1.0,snes_solution);CHKERRQ(ierr);
243e5f7ee39SBarry Smith   ierr = SNESComputeFunction(snes,work1,work2);CHKERRQ(ierr);
244e5f7ee39SBarry Smith   ierr = VecNorm(work2,NORM_2,y+1);CHKERRQ(ierr);
245e5f7ee39SBarry Smith   if (y[1] > 0.0) y[1] = PetscLog10Real(y[1]);
246e5f7ee39SBarry Smith   else y[1] = -15.0;
247e5f7ee39SBarry Smith   ierr = VecDestroy(&work1);CHKERRQ(ierr);
248e5f7ee39SBarry Smith   ierr = VecDestroy(&work2);CHKERRQ(ierr);
249e5f7ee39SBarry Smith 
250e5f7ee39SBarry Smith   ierr = PetscDrawLGAddPoint(lg,NULL,y);CHKERRQ(ierr);
2516934998bSLisandro Dalcin   if (n < 20 || !(n % 5) || snes->reason) {
252e5f7ee39SBarry Smith     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
2536934998bSLisandro Dalcin     ierr = PetscDrawLGSave(lg);CHKERRQ(ierr);
254e5f7ee39SBarry Smith   }
255e5f7ee39SBarry Smith   PetscFunctionReturn(0);
256e5f7ee39SBarry Smith }
257e5f7ee39SBarry Smith 
258e5f7ee39SBarry Smith #undef __FUNCT__
259e5f7ee39SBarry Smith #define __FUNCT__ "KSPMonitorSNESLGResidualNormDestroy"
260e5f7ee39SBarry Smith /*@
261e5f7ee39SBarry Smith    KSPMonitorSNESLGResidualNormDestroy - Destroys a line graph context that was created
262e5f7ee39SBarry Smith    with KSPMonitorSNESLGResidualNormCreate().
263e5f7ee39SBarry Smith 
264e5f7ee39SBarry Smith    Collective on KSP
265e5f7ee39SBarry Smith 
266e5f7ee39SBarry Smith    Input Parameter:
267e5f7ee39SBarry Smith .  draw - the drawing context
268e5f7ee39SBarry Smith 
269e5f7ee39SBarry Smith    Level: intermediate
270e5f7ee39SBarry Smith 
271e5f7ee39SBarry Smith .keywords: KSP, monitor, line graph, destroy
272e5f7ee39SBarry Smith 
273e5f7ee39SBarry Smith .seealso: KSPMonitorSNESLGResidualNormCreate(), KSPMonitorSNESLGTrueResidualDestroy(), KSPMonitorSet()
274e5f7ee39SBarry Smith @*/
275e5f7ee39SBarry Smith PetscErrorCode  KSPMonitorSNESLGResidualNormDestroy(PetscObject **objs)
276e5f7ee39SBarry Smith {
277e5f7ee39SBarry Smith   PetscErrorCode ierr;
278c36cb520SLisandro Dalcin   PetscDrawLG    lg = (PetscDrawLG) (*objs)[1];
279e5f7ee39SBarry Smith 
280e5f7ee39SBarry Smith   PetscFunctionBegin;
281c36cb520SLisandro Dalcin   ierr = PetscDrawLGDestroy(&lg);CHKERRQ(ierr);
282e5f7ee39SBarry Smith   ierr = PetscFree(*objs);CHKERRQ(ierr);
283e5f7ee39SBarry Smith   PetscFunctionReturn(0);
284e5f7ee39SBarry Smith }
285e5f7ee39SBarry Smith 
286a5c2985bSBarry Smith #undef __FUNCT__
287a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorDefault"
2884b828684SBarry Smith /*@C
289a6570f20SBarry Smith    SNESMonitorDefault - Monitors progress of the SNES solvers (default).
290e7e93795SLois Curfman McInnes 
291c7afd0dbSLois Curfman McInnes    Collective on SNES
292c7afd0dbSLois Curfman McInnes 
293e7e93795SLois Curfman McInnes    Input Parameters:
294c7afd0dbSLois Curfman McInnes +  snes - the SNES context
295e7e93795SLois Curfman McInnes .  its - iteration number
2964b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
297d43b4f6eSBarry Smith -  vf - viewer and format structure
298fee21e36SBarry Smith 
299e7e93795SLois Curfman McInnes    Notes:
3004b27c08aSLois Curfman McInnes    This routine prints the residual norm at each iteration.
301e7e93795SLois Curfman McInnes 
30236851e7fSLois Curfman McInnes    Level: intermediate
30336851e7fSLois Curfman McInnes 
304e7e93795SLois Curfman McInnes .keywords: SNES, nonlinear, default, monitor, norm
305e7e93795SLois Curfman McInnes 
306a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution()
307e7e93795SLois Curfman McInnes @*/
308d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorDefault(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
309e7e93795SLois Curfman McInnes {
310dfbe8321SBarry Smith   PetscErrorCode ierr;
311d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
312d132466eSBarry Smith 
3133a40ed3dSBarry Smith   PetscFunctionBegin;
3144d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
315d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
316649052a6SBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
317649052a6SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e \n",its,(double)fgnorm);CHKERRQ(ierr);
318649052a6SBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
319d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr) ;
3203a40ed3dSBarry Smith   PetscFunctionReturn(0);
321e7e93795SLois Curfman McInnes }
3223f1db9ecSBarry Smith 
323b271bb04SBarry Smith #undef __FUNCT__
3242e7541e6SPeter Brune #define __FUNCT__ "SNESMonitorJacUpdateSpectrum"
325d43b4f6eSBarry Smith PetscErrorCode SNESMonitorJacUpdateSpectrum(SNES snes,PetscInt it,PetscReal fnorm,PetscViewerAndFormat *vf)
326a80ad3e0SBarry Smith {
327196da8b6SPeter Brune #if defined(PETSC_MISSING_LAPACK_GEEV)
328ce94432eSBarry Smith   SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_SUP,"GEEV - Lapack routine is unavailable\nNot able to provide eigen values.");
329196da8b6SPeter Brune #elif defined(PETSC_HAVE_ESSL)
330ce94432eSBarry Smith   SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_SUP,"GEEV - No support for ESSL Lapack Routines");
331196da8b6SPeter Brune #else
3322e7541e6SPeter Brune   Vec            X;
3332e7541e6SPeter Brune   Mat            J,dJ,dJdense;
3342e7541e6SPeter Brune   PetscErrorCode ierr;
335d1e9a80fSBarry Smith   PetscErrorCode (*func)(SNES,Vec,Mat,Mat,void*);
3362e7541e6SPeter Brune   PetscInt       n,i;
3372e7541e6SPeter Brune   PetscBLASInt   nb,lwork;
3382e7541e6SPeter Brune   PetscReal      *eigr,*eigi;
3392e7541e6SPeter Brune   PetscScalar    *work;
3402e7541e6SPeter Brune   PetscScalar    *a;
3412e7541e6SPeter Brune 
3422e7541e6SPeter Brune   PetscFunctionBegin;
3432e7541e6SPeter Brune   if (it == 0) PetscFunctionReturn(0);
3442e7541e6SPeter Brune   /* create the difference between the current update and the current jacobian */
3452e7541e6SPeter Brune   ierr = SNESGetSolution(snes,&X);CHKERRQ(ierr);
346d1e9a80fSBarry Smith   ierr = SNESGetJacobian(snes,NULL,&J,&func,NULL);CHKERRQ(ierr);
3472e7541e6SPeter Brune   ierr = MatDuplicate(J,MAT_COPY_VALUES,&dJ);CHKERRQ(ierr);
348d1e9a80fSBarry Smith   ierr = SNESComputeJacobian(snes,X,dJ,dJ);CHKERRQ(ierr);
3492e7541e6SPeter Brune   ierr = MatAXPY(dJ,-1.0,J,SAME_NONZERO_PATTERN);CHKERRQ(ierr);
350f5af7f23SKarl Rupp 
3512e7541e6SPeter Brune   /* compute the spectrum directly */
3522e7541e6SPeter Brune   ierr  = MatConvert(dJ,MATSEQDENSE,MAT_INITIAL_MATRIX,&dJdense);CHKERRQ(ierr);
3530298fd71SBarry Smith   ierr  = MatGetSize(dJ,&n,NULL);CHKERRQ(ierr);
354c5df96a5SBarry Smith   ierr  = PetscBLASIntCast(n,&nb);CHKERRQ(ierr);
3552e7541e6SPeter Brune   lwork = 3*nb;
356785e854fSJed Brown   ierr  = PetscMalloc1(n,&eigr);CHKERRQ(ierr);
357785e854fSJed Brown   ierr  = PetscMalloc1(n,&eigi);CHKERRQ(ierr);
358785e854fSJed Brown   ierr  = PetscMalloc1(lwork,&work);CHKERRQ(ierr);
3598c778c55SBarry Smith   ierr  = MatDenseGetArray(dJdense,&a);CHKERRQ(ierr);
3602e7541e6SPeter Brune #if !defined(PETSC_USE_COMPLEX)
3612e7541e6SPeter Brune   {
3622e7541e6SPeter Brune     PetscBLASInt lierr;
3632e7541e6SPeter Brune     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
3648b83055fSJed Brown     PetscStackCallBLAS("LAPACKgeev",LAPACKgeev_("N","N",&nb,a,&nb,eigr,eigi,NULL,&nb,NULL,&nb,work,&lwork,&lierr));
3652e7541e6SPeter Brune     if (lierr) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"geev() error %d",lierr);
3662e7541e6SPeter Brune     ierr = PetscFPTrapPop();CHKERRQ(ierr);
3672e7541e6SPeter Brune   }
3682e7541e6SPeter Brune #else
3692e7541e6SPeter Brune   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Not coded for complex");
3702e7541e6SPeter Brune #endif
371fde5950dSBarry Smith   ierr = PetscPrintf(PetscObjectComm((PetscObject)snes),"Eigenvalues of J_%d - J_%d:\n",it,it-1);CHKERRQ(ierr);
3722e7541e6SPeter Brune   for (i=0;i<n;i++) {
373fde5950dSBarry Smith     ierr = PetscPrintf(PetscObjectComm((PetscObject)snes),"%5d: %20.5g + %20.5gi\n",i,(double)eigr[i],(double)eigi[i]);CHKERRQ(ierr);
3742e7541e6SPeter Brune   }
3758c778c55SBarry Smith   ierr = MatDenseRestoreArray(dJdense,&a);CHKERRQ(ierr);
3762e7541e6SPeter Brune   ierr = MatDestroy(&dJ);CHKERRQ(ierr);
3772e7541e6SPeter Brune   ierr = MatDestroy(&dJdense);CHKERRQ(ierr);
3782e7541e6SPeter Brune   ierr = PetscFree(eigr);CHKERRQ(ierr);
3792e7541e6SPeter Brune   ierr = PetscFree(eigi);CHKERRQ(ierr);
3802e7541e6SPeter Brune   ierr = PetscFree(work);CHKERRQ(ierr);
3812e7541e6SPeter Brune   PetscFunctionReturn(0);
382196da8b6SPeter Brune #endif
3832e7541e6SPeter Brune }
3842e7541e6SPeter Brune 
3856ba87a44SLisandro Dalcin PETSC_INTERN PetscErrorCode  SNESMonitorRange_Private(SNES,PetscInt,PetscReal*);
3866ba87a44SLisandro Dalcin 
3872e7541e6SPeter Brune #undef __FUNCT__
388b271bb04SBarry Smith #define __FUNCT__ "SNESMonitorRange_Private"
3897087cfbeSBarry Smith PetscErrorCode  SNESMonitorRange_Private(SNES snes,PetscInt it,PetscReal *per)
390b271bb04SBarry Smith {
391b271bb04SBarry Smith   PetscErrorCode ierr;
392b271bb04SBarry Smith   Vec            resid;
393b271bb04SBarry Smith   PetscReal      rmax,pwork;
394b271bb04SBarry Smith   PetscInt       i,n,N;
395b271bb04SBarry Smith   PetscScalar    *r;
396b271bb04SBarry Smith 
397b271bb04SBarry Smith   PetscFunctionBegin;
398b271bb04SBarry Smith   ierr  = SNESGetFunction(snes,&resid,0,0);CHKERRQ(ierr);
399b271bb04SBarry Smith   ierr  = VecNorm(resid,NORM_INFINITY,&rmax);CHKERRQ(ierr);
400b271bb04SBarry Smith   ierr  = VecGetLocalSize(resid,&n);CHKERRQ(ierr);
401b271bb04SBarry Smith   ierr  = VecGetSize(resid,&N);CHKERRQ(ierr);
402b271bb04SBarry Smith   ierr  = VecGetArray(resid,&r);CHKERRQ(ierr);
403b271bb04SBarry Smith   pwork = 0.0;
404b271bb04SBarry Smith   for (i=0; i<n; i++) {
405b271bb04SBarry Smith     pwork += (PetscAbsScalar(r[i]) > .20*rmax);
406b271bb04SBarry Smith   }
407b2566f29SBarry Smith   ierr = MPIU_Allreduce(&pwork,per,1,MPIU_REAL,MPIU_SUM,PetscObjectComm((PetscObject)snes));CHKERRQ(ierr);
408b271bb04SBarry Smith   ierr = VecRestoreArray(resid,&r);CHKERRQ(ierr);
409b271bb04SBarry Smith   *per = *per/N;
410b271bb04SBarry Smith   PetscFunctionReturn(0);
411b271bb04SBarry Smith }
412b271bb04SBarry Smith 
413b271bb04SBarry Smith #undef __FUNCT__
414b271bb04SBarry Smith #define __FUNCT__ "SNESMonitorRange"
415b271bb04SBarry Smith /*@C
416b271bb04SBarry Smith    SNESMonitorRange - Prints the percentage of residual elements that are more then 10 percent of the maximum value.
417b271bb04SBarry Smith 
418b271bb04SBarry Smith    Collective on SNES
419b271bb04SBarry Smith 
420b271bb04SBarry Smith    Input Parameters:
421b271bb04SBarry Smith +  snes   - iterative context
422b271bb04SBarry Smith .  it    - iteration number
423b271bb04SBarry Smith .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
424b271bb04SBarry Smith -  dummy - unused monitor context
425b271bb04SBarry Smith 
426b271bb04SBarry Smith    Options Database Key:
427b271bb04SBarry Smith .  -snes_monitor_range - Activates SNESMonitorRange()
428b271bb04SBarry Smith 
429b271bb04SBarry Smith    Level: intermediate
430b271bb04SBarry Smith 
431b271bb04SBarry Smith .keywords: SNES, default, monitor, residual
432b271bb04SBarry Smith 
433b271bb04SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), SNESMonitorLGCreate()
434b271bb04SBarry Smith @*/
435d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorRange(SNES snes,PetscInt it,PetscReal rnorm,PetscViewerAndFormat *vf)
436b271bb04SBarry Smith {
437b271bb04SBarry Smith   PetscErrorCode ierr;
438b271bb04SBarry Smith   PetscReal      perc,rel;
439d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
440b271bb04SBarry Smith   /* should be in a MonitorRangeContext */
441b271bb04SBarry Smith   static PetscReal prev;
442b271bb04SBarry Smith 
443b271bb04SBarry Smith   PetscFunctionBegin;
4444d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
445b271bb04SBarry Smith   if (!it) prev = rnorm;
446b271bb04SBarry Smith   ierr = SNESMonitorRange_Private(snes,it,&perc);CHKERRQ(ierr);
447b271bb04SBarry Smith 
448b271bb04SBarry Smith   rel  = (prev - rnorm)/prev;
449b271bb04SBarry Smith   prev = rnorm;
450d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
451649052a6SBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
4526712e2f1SBarry 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);
453649052a6SBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
454d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
455b271bb04SBarry Smith   PetscFunctionReturn(0);
456b271bb04SBarry Smith }
457b271bb04SBarry Smith 
4583a7fca6bSBarry Smith #undef __FUNCT__
459a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorRatio"
4603a7fca6bSBarry Smith /*@C
461a6570f20SBarry Smith    SNESMonitorRatio - Monitors progress of the SNES solvers by printing the ratio
4624b27c08aSLois Curfman McInnes    of residual norm at each iteration to the previous.
4633a7fca6bSBarry Smith 
4643a7fca6bSBarry Smith    Collective on SNES
4653a7fca6bSBarry Smith 
4663a7fca6bSBarry Smith    Input Parameters:
4673a7fca6bSBarry Smith +  snes - the SNES context
4683a7fca6bSBarry Smith .  its - iteration number
4693a7fca6bSBarry Smith .  fgnorm - 2-norm of residual (or gradient)
470eabae89aSBarry Smith -  dummy -  context of monitor
4713a7fca6bSBarry Smith 
4723a7fca6bSBarry Smith    Level: intermediate
4733a7fca6bSBarry Smith 
474fde5950dSBarry Smith    Notes: Insure that SNESMonitorRatio() is called when you set this monitor
4753a7fca6bSBarry Smith .keywords: SNES, nonlinear, monitor, norm
4763a7fca6bSBarry Smith 
477fde5950dSBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorRatio()
4783a7fca6bSBarry Smith @*/
479d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorRatio(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
4803a7fca6bSBarry Smith {
481dfbe8321SBarry Smith   PetscErrorCode          ierr;
48277431f27SBarry Smith   PetscInt                len;
48387828ca2SBarry Smith   PetscReal               *history;
484d43b4f6eSBarry Smith   PetscViewer             viewer = vf->viewer;
4853a7fca6bSBarry Smith 
4863a7fca6bSBarry Smith   PetscFunctionBegin;
4870298fd71SBarry Smith   ierr = SNESGetConvergenceHistory(snes,&history,NULL,&len);CHKERRQ(ierr);
488d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
489fde5950dSBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
490958c9bccSBarry Smith   if (!its || !history || its > len) {
491fde5950dSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e \n",its,(double)fgnorm);CHKERRQ(ierr);
4923a7fca6bSBarry Smith   } else {
49387828ca2SBarry Smith     PetscReal ratio = fgnorm/history[its-1];
494fde5950dSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e %14.12e \n",its,(double)fgnorm,(double)ratio);CHKERRQ(ierr);
4953a7fca6bSBarry Smith   }
496fde5950dSBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
497d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
4983a7fca6bSBarry Smith   PetscFunctionReturn(0);
4993a7fca6bSBarry Smith }
5003a7fca6bSBarry Smith 
5013a7fca6bSBarry Smith #undef __FUNCT__
502fde5950dSBarry Smith #define __FUNCT__ "SNESMonitorRatioSetUp"
5033a7fca6bSBarry Smith /*@C
504fde5950dSBarry Smith    SNESMonitorRatioSetUp - Insures the SNES object is saving its history since this monitor needs access to it
5053a7fca6bSBarry Smith 
5063a7fca6bSBarry Smith    Collective on SNES
5073a7fca6bSBarry Smith 
5083a7fca6bSBarry Smith    Input Parameters:
509eabae89aSBarry Smith +   snes - the SNES context
510fde5950dSBarry Smith -   viewer - the PetscViewer object (ignored)
5113a7fca6bSBarry Smith 
5123a7fca6bSBarry Smith    Level: intermediate
5133a7fca6bSBarry Smith 
5143a7fca6bSBarry Smith .keywords: SNES, nonlinear, monitor, norm
5153a7fca6bSBarry Smith 
516fde5950dSBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault(), SNESMonitorRatio()
5173a7fca6bSBarry Smith @*/
518d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorRatioSetUp(SNES snes,PetscViewerAndFormat *vf)
5193a7fca6bSBarry Smith {
520dfbe8321SBarry Smith   PetscErrorCode          ierr;
52187828ca2SBarry Smith   PetscReal               *history;
5223a7fca6bSBarry Smith 
5233a7fca6bSBarry Smith   PetscFunctionBegin;
5240298fd71SBarry Smith   ierr = SNESGetConvergenceHistory(snes,&history,NULL,NULL);CHKERRQ(ierr);
5253a7fca6bSBarry Smith   if (!history) {
526fde5950dSBarry Smith     ierr = SNESSetConvergenceHistory(snes,NULL,NULL,100,PETSC_TRUE);CHKERRQ(ierr);
5273a7fca6bSBarry Smith   }
5283a7fca6bSBarry Smith   PetscFunctionReturn(0);
5293a7fca6bSBarry Smith }
5303a7fca6bSBarry Smith 
531e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */
5324a2ae208SSatish Balay #undef __FUNCT__
533a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorDefaultShort"
534be1f7002SBarry Smith /*
535a6570f20SBarry Smith      Default (short) SNES Monitor, same as SNESMonitorDefault() except
536be1f7002SBarry Smith   it prints fewer digits of the residual as the residual gets smaller.
537be1f7002SBarry Smith   This is because the later digits are meaningless and are often
538be1f7002SBarry Smith   different on different machines; by using this routine different
539be1f7002SBarry Smith   machines will usually generate the same output.
540be1f7002SBarry Smith */
541d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorDefaultShort(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
542e7e93795SLois Curfman McInnes {
543dfbe8321SBarry Smith   PetscErrorCode ierr;
544d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
545d132466eSBarry Smith 
5463a40ed3dSBarry Smith   PetscFunctionBegin;
5474d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
548d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
549649052a6SBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
5508f240d10SBarry Smith   if (fgnorm > 1.e-9) {
5518fa295daSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %g \n",its,(double)fgnorm);CHKERRQ(ierr);
5523a40ed3dSBarry Smith   } else if (fgnorm > 1.e-11) {
5538fa295daSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %5.3e \n",its,(double)fgnorm);CHKERRQ(ierr);
5543a40ed3dSBarry Smith   } else {
555649052a6SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm < 1.e-11\n",its);CHKERRQ(ierr);
556a34d58ebSBarry Smith   }
557649052a6SBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
558d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
5593a40ed3dSBarry Smith   PetscFunctionReturn(0);
560e7e93795SLois Curfman McInnes }
5612db13446SMatthew G. Knepley 
5622db13446SMatthew G. Knepley #undef __FUNCT__
5632db13446SMatthew G. Knepley #define __FUNCT__ "SNESMonitorDefaultField"
5642db13446SMatthew G. Knepley /*@C
5652db13446SMatthew G. Knepley   SNESMonitorDefaultField - Monitors progress of the SNES solvers, separated into fields.
5662db13446SMatthew G. Knepley 
5672db13446SMatthew G. Knepley   Collective on SNES
5682db13446SMatthew G. Knepley 
5692db13446SMatthew G. Knepley   Input Parameters:
5702db13446SMatthew G. Knepley + snes   - the SNES context
5712db13446SMatthew G. Knepley . its    - iteration number
5722db13446SMatthew G. Knepley . fgnorm - 2-norm of residual
5732db13446SMatthew G. Knepley - ctx    - the PetscViewer
5742db13446SMatthew G. Knepley 
5752db13446SMatthew G. Knepley   Notes:
5762db13446SMatthew G. Knepley   This routine uses the DM attached to the residual vector
5772db13446SMatthew G. Knepley 
5782db13446SMatthew G. Knepley   Level: intermediate
5792db13446SMatthew G. Knepley 
5802db13446SMatthew G. Knepley .keywords: SNES, nonlinear, field, monitor, norm
5812db13446SMatthew G. Knepley .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault(), SNESMonitorDefaultShort()
5822db13446SMatthew G. Knepley @*/
583d43b4f6eSBarry Smith PetscErrorCode SNESMonitorDefaultField(SNES snes, PetscInt its, PetscReal fgnorm, PetscViewerAndFormat *vf)
5842db13446SMatthew G. Knepley {
585d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
5862db13446SMatthew G. Knepley   Vec            r;
5872db13446SMatthew G. Knepley   DM             dm;
5882db13446SMatthew G. Knepley   PetscReal      res[256];
5892db13446SMatthew G. Knepley   PetscInt       tablevel;
5902db13446SMatthew G. Knepley   PetscErrorCode ierr;
5912db13446SMatthew G. Knepley 
5922db13446SMatthew G. Knepley   PetscFunctionBegin;
5934d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
5942db13446SMatthew G. Knepley   ierr = SNESGetFunction(snes, &r, NULL, NULL);CHKERRQ(ierr);
5952db13446SMatthew G. Knepley   ierr = VecGetDM(r, &dm);CHKERRQ(ierr);
596d43b4f6eSBarry Smith   if (!dm) {ierr = SNESMonitorDefault(snes, its, fgnorm, vf);CHKERRQ(ierr);}
5972db13446SMatthew G. Knepley   else {
5982db13446SMatthew G. Knepley     PetscSection s, gs;
5992db13446SMatthew G. Knepley     PetscInt     Nf, f;
6002db13446SMatthew G. Knepley 
6012db13446SMatthew G. Knepley     ierr = DMGetDefaultSection(dm, &s);CHKERRQ(ierr);
6022db13446SMatthew G. Knepley     ierr = DMGetDefaultGlobalSection(dm, &gs);CHKERRQ(ierr);
603d43b4f6eSBarry Smith     if (!s || !gs) {ierr = SNESMonitorDefault(snes, its, fgnorm, vf);CHKERRQ(ierr);}
6042db13446SMatthew G. Knepley     ierr = PetscSectionGetNumFields(s, &Nf);CHKERRQ(ierr);
6052db13446SMatthew G. Knepley     if (Nf > 256) SETERRQ1(PetscObjectComm((PetscObject) snes), PETSC_ERR_SUP, "Do not support %d fields > 256", Nf);
6062db13446SMatthew G. Knepley     ierr = PetscSectionVecNorm(s, gs, r, NORM_2, res);CHKERRQ(ierr);
6072db13446SMatthew G. Knepley     ierr = PetscObjectGetTabLevel((PetscObject) snes, &tablevel);CHKERRQ(ierr);
608d43b4f6eSBarry Smith     ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
6092db13446SMatthew G. Knepley     ierr = PetscViewerASCIIAddTab(viewer, tablevel);CHKERRQ(ierr);
6102db13446SMatthew G. Knepley     ierr = PetscViewerASCIIPrintf(viewer, "%3D SNES Function norm %14.12e [", its, (double) fgnorm);CHKERRQ(ierr);
6112db13446SMatthew G. Knepley     for (f = 0; f < Nf; ++f) {
6122db13446SMatthew G. Knepley       if (f) {ierr = PetscViewerASCIIPrintf(viewer, ", ");CHKERRQ(ierr);}
6132db13446SMatthew G. Knepley       ierr = PetscViewerASCIIPrintf(viewer, "%14.12e", res[f]);CHKERRQ(ierr);
6142db13446SMatthew G. Knepley     }
6152db13446SMatthew G. Knepley     ierr = PetscViewerASCIIPrintf(viewer, "] \n");CHKERRQ(ierr);
6162db13446SMatthew G. Knepley     ierr = PetscViewerASCIISubtractTab(viewer, tablevel);CHKERRQ(ierr);
617d43b4f6eSBarry Smith     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
6182db13446SMatthew G. Knepley   }
6192db13446SMatthew G. Knepley   PetscFunctionReturn(0);
6202db13446SMatthew G. Knepley }
621e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */
6224a2ae208SSatish Balay #undef __FUNCT__
6238d359177SBarry Smith #define __FUNCT__ "SNESConvergedDefault"
6244b828684SBarry Smith /*@C
6258d359177SBarry Smith    SNESConvergedDefault - Convergence test of the solvers for
626f525115eSLois Curfman McInnes    systems of nonlinear equations (default).
627e7e93795SLois Curfman McInnes 
628c7afd0dbSLois Curfman McInnes    Collective on SNES
629c7afd0dbSLois Curfman McInnes 
630e7e93795SLois Curfman McInnes    Input Parameters:
631c7afd0dbSLois Curfman McInnes +  snes - the SNES context
63206ee9f85SBarry Smith .  it - the iteration (0 indicates before any Newton steps)
633e7e93795SLois Curfman McInnes .  xnorm - 2-norm of current iterate
634c60f73f4SPeter Brune .  snorm - 2-norm of current step
6357f3332b4SBarry Smith .  fnorm - 2-norm of function at current iterate
636c7afd0dbSLois Curfman McInnes -  dummy - unused context
637e7e93795SLois Curfman McInnes 
638184914b5SBarry Smith    Output Parameter:
639184914b5SBarry Smith .   reason  - one of
64070441072SBarry Smith $  SNES_CONVERGED_FNORM_ABS       - (fnorm < abstol),
641c60f73f4SPeter Brune $  SNES_CONVERGED_SNORM_RELATIVE  - (snorm < stol*xnorm),
642184914b5SBarry Smith $  SNES_CONVERGED_FNORM_RELATIVE  - (fnorm < rtol*fnorm0),
643184914b5SBarry Smith $  SNES_DIVERGED_FUNCTION_COUNT   - (nfct > maxf),
644184914b5SBarry Smith $  SNES_DIVERGED_FNORM_NAN        - (fnorm == NaN),
645184914b5SBarry Smith $  SNES_CONVERGED_ITERATING       - (otherwise),
646e7e93795SLois Curfman McInnes 
647e7e93795SLois Curfman McInnes    where
648c7afd0dbSLois Curfman McInnes +    maxf - maximum number of function evaluations,
649c7afd0dbSLois Curfman McInnes             set with SNESSetTolerances()
650c7afd0dbSLois Curfman McInnes .    nfct - number of function evaluations,
65170441072SBarry Smith .    abstol - absolute function norm tolerance,
652c7afd0dbSLois Curfman McInnes             set with SNESSetTolerances()
653c7afd0dbSLois Curfman McInnes -    rtol - relative function norm tolerance, set with SNESSetTolerances()
654fee21e36SBarry Smith 
65536851e7fSLois Curfman McInnes    Level: intermediate
65636851e7fSLois Curfman McInnes 
657e7e93795SLois Curfman McInnes .keywords: SNES, nonlinear, default, converged, convergence
658e7e93795SLois Curfman McInnes 
65971f87433Sdalcinl .seealso: SNESSetConvergenceTest()
660e7e93795SLois Curfman McInnes @*/
6618d359177SBarry Smith PetscErrorCode  SNESConvergedDefault(SNES snes,PetscInt it,PetscReal xnorm,PetscReal snorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy)
662e7e93795SLois Curfman McInnes {
66363ba0a88SBarry Smith   PetscErrorCode ierr;
66463ba0a88SBarry Smith 
6653a40ed3dSBarry Smith   PetscFunctionBegin;
6660700a824SBarry Smith   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
6673f149594SLisandro Dalcin   PetscValidPointer(reason,6);
6683f149594SLisandro Dalcin 
66906ee9f85SBarry Smith   *reason = SNES_CONVERGED_ITERATING;
67006ee9f85SBarry Smith 
67106ee9f85SBarry Smith   if (!it) {
67206ee9f85SBarry Smith     /* set parameter for default relative tolerance convergence test */
67306ee9f85SBarry Smith     snes->ttol   = fnorm*snes->rtol;
674e37c518bSBarry Smith     snes->rnorm0 = fnorm;
67506ee9f85SBarry Smith   }
6768146f6ebSBarry Smith   if (PetscIsInfOrNanReal(fnorm)) {
677ae15b995SBarry Smith     ierr    = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr);
678184914b5SBarry Smith     *reason = SNES_DIVERGED_FNORM_NAN;
67970441072SBarry Smith   } else if (fnorm < snes->abstol) {
6808f1a2a5eSBarry Smith     ierr    = PetscInfo2(snes,"Converged due to function norm %14.12e < %14.12e\n",(double)fnorm,(double)snes->abstol);CHKERRQ(ierr);
681184914b5SBarry Smith     *reason = SNES_CONVERGED_FNORM_ABS;
68243e71028SBarry Smith   } else if (snes->nfuncs >= snes->max_funcs) {
683ae15b995SBarry Smith     ierr    = PetscInfo2(snes,"Exceeded maximum number of function evaluations: %D > %D\n",snes->nfuncs,snes->max_funcs);CHKERRQ(ierr);
684184914b5SBarry Smith     *reason = SNES_DIVERGED_FUNCTION_COUNT;
68506ee9f85SBarry Smith   }
68606ee9f85SBarry Smith 
68706ee9f85SBarry Smith   if (it && !*reason) {
68806ee9f85SBarry Smith     if (fnorm <= snes->ttol) {
6898f1a2a5eSBarry Smith       ierr    = PetscInfo2(snes,"Converged due to function norm %14.12e < %14.12e (relative tolerance)\n",(double)fnorm,(double)snes->ttol);CHKERRQ(ierr);
69006ee9f85SBarry Smith       *reason = SNES_CONVERGED_FNORM_RELATIVE;
691c60f73f4SPeter Brune     } else if (snorm < snes->stol*xnorm) {
692c60f73f4SPeter 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);
693c60f73f4SPeter Brune       *reason = SNES_CONVERGED_SNORM_RELATIVE;
694e4d06f11SPatrick Farrell     } else if (snes->divtol > 0 && (fnorm > snes->divtol*snes->rnorm0)) {
695e37c518bSBarry Smith       ierr    = PetscInfo3(snes,"Diverged due to increase in function norm: %14.12e > %14.12e * %14.12e\n",(double)fnorm,(double)snes->divtol,(double)snes->rnorm0);CHKERRQ(ierr);
696e37c518bSBarry Smith       *reason = SNES_DIVERGED_DTOL;
69706ee9f85SBarry Smith     }
698e37c518bSBarry Smith 
699e7e93795SLois Curfman McInnes   }
7003a40ed3dSBarry Smith   PetscFunctionReturn(0);
701e7e93795SLois Curfman McInnes }
7023f149594SLisandro Dalcin 
7033f149594SLisandro Dalcin #undef __FUNCT__
704e2a6519dSDmitry Karpeev #define __FUNCT__ "SNESConvergedSkip"
7053f149594SLisandro Dalcin /*@C
706e2a6519dSDmitry Karpeev    SNESConvergedSkip - Convergence test for SNES that NEVER returns as
7073f149594SLisandro Dalcin    converged, UNLESS the maximum number of iteration have been reached.
7083f149594SLisandro Dalcin 
7093f9fe445SBarry Smith    Logically Collective on SNES
7103f149594SLisandro Dalcin 
7113f149594SLisandro Dalcin    Input Parameters:
7123f149594SLisandro Dalcin +  snes - the SNES context
7133f149594SLisandro Dalcin .  it - the iteration (0 indicates before any Newton steps)
7143f149594SLisandro Dalcin .  xnorm - 2-norm of current iterate
715c60f73f4SPeter Brune .  snorm - 2-norm of current step
7163f149594SLisandro Dalcin .  fnorm - 2-norm of function at current iterate
7173f149594SLisandro Dalcin -  dummy - unused context
7183f149594SLisandro Dalcin 
7193f149594SLisandro Dalcin    Output Parameter:
72085385478SLisandro Dalcin .   reason  - SNES_CONVERGED_ITERATING, SNES_CONVERGED_ITS, or SNES_DIVERGED_FNORM_NAN
7213f149594SLisandro Dalcin 
7223f149594SLisandro Dalcin    Notes:
7233f149594SLisandro Dalcin    Convergence is then declared after a fixed number of iterations have been used.
7243f149594SLisandro Dalcin 
7253f149594SLisandro Dalcin    Level: advanced
7263f149594SLisandro Dalcin 
7273f149594SLisandro Dalcin .keywords: SNES, nonlinear, skip, converged, convergence
7283f149594SLisandro Dalcin 
7293f149594SLisandro Dalcin .seealso: SNESSetConvergenceTest()
7303f149594SLisandro Dalcin @*/
731e2a6519dSDmitry Karpeev PetscErrorCode  SNESConvergedSkip(SNES snes,PetscInt it,PetscReal xnorm,PetscReal snorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy)
7323f149594SLisandro Dalcin {
7333f149594SLisandro Dalcin   PetscErrorCode ierr;
7343f149594SLisandro Dalcin 
7353f149594SLisandro Dalcin   PetscFunctionBegin;
7360700a824SBarry Smith   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
7373f149594SLisandro Dalcin   PetscValidPointer(reason,6);
7383f149594SLisandro Dalcin 
7393f149594SLisandro Dalcin   *reason = SNES_CONVERGED_ITERATING;
7403f149594SLisandro Dalcin 
7413f149594SLisandro Dalcin   if (fnorm != fnorm) {
7423f149594SLisandro Dalcin     ierr    = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr);
7433f149594SLisandro Dalcin     *reason = SNES_DIVERGED_FNORM_NAN;
7443f149594SLisandro Dalcin   } else if (it == snes->max_its) {
7453f149594SLisandro Dalcin     *reason = SNES_CONVERGED_ITS;
7463f149594SLisandro Dalcin   }
7473f149594SLisandro Dalcin   PetscFunctionReturn(0);
7483f149594SLisandro Dalcin }
7493f149594SLisandro Dalcin 
75058c9b817SLisandro Dalcin #undef __FUNCT__
751fa0ddf94SBarry Smith #define __FUNCT__ "SNESSetWorkVecs"
7528d359177SBarry Smith /*@C
753fa0ddf94SBarry Smith   SNESSetWorkVecs - Gets a number of work vectors.
75458c9b817SLisandro Dalcin 
75558c9b817SLisandro Dalcin   Input Parameters:
75658c9b817SLisandro Dalcin . snes  - the SNES context
75758c9b817SLisandro Dalcin . nw - number of work vectors to allocate
75858c9b817SLisandro Dalcin 
75958c9b817SLisandro Dalcin    Level: developer
76058c9b817SLisandro Dalcin 
761fa0ddf94SBarry Smith    Developers Note: This is PETSC_EXTERN because it may be used by user written plugin SNES implementations
762fa0ddf94SBarry Smith 
76398acb6afSMatthew G Knepley @*/
764fa0ddf94SBarry Smith PetscErrorCode SNESSetWorkVecs(SNES snes,PetscInt nw)
76558c9b817SLisandro Dalcin {
766c5ed8070SMatthew G. Knepley   DM             dm;
767c5ed8070SMatthew G. Knepley   Vec            v;
76858c9b817SLisandro Dalcin   PetscErrorCode ierr;
76958c9b817SLisandro Dalcin 
77058c9b817SLisandro Dalcin   PetscFunctionBegin;
77158c9b817SLisandro Dalcin   if (snes->work) {ierr = VecDestroyVecs(snes->nwork,&snes->work);CHKERRQ(ierr);}
77258c9b817SLisandro Dalcin   snes->nwork = nw;
773f5af7f23SKarl Rupp 
774c5ed8070SMatthew G. Knepley   ierr = SNESGetDM(snes, &dm);CHKERRQ(ierr);
775c5ed8070SMatthew G. Knepley   ierr = DMGetGlobalVector(dm, &v);CHKERRQ(ierr);
776c5ed8070SMatthew G. Knepley   ierr = VecDuplicateVecs(v,snes->nwork,&snes->work);CHKERRQ(ierr);
777c5ed8070SMatthew G. Knepley   ierr = DMRestoreGlobalVector(dm, &v);CHKERRQ(ierr);
77858c9b817SLisandro Dalcin   ierr = PetscLogObjectParents(snes,nw,snes->work);CHKERRQ(ierr);
77958c9b817SLisandro Dalcin   PetscFunctionReturn(0);
78058c9b817SLisandro Dalcin }
781