xref: /petsc/src/snes/interface/snesut.c (revision 2f96bde400407cceacf977a6418f7f76d7b04372)
1e7e93795SLois Curfman McInnes 
2af0996ceSBarry Smith #include <petsc/private/snesimpl.h>       /*I   "petsc/private/snesimpl.h"   I*/
3636fd056SMatthew G. Knepley #include <petscdm.h>
4ea844a1aSMatthew Knepley #include <petscsection.h>
52e7541e6SPeter Brune #include <petscblaslapack.h>
6e7e93795SLois Curfman McInnes 
73f1db9ecSBarry Smith /*@C
8a6570f20SBarry Smith    SNESMonitorSolution - Monitors progress of the SNES solvers by calling
936851e7fSLois Curfman McInnes    VecView() for the approximate solution at each iteration.
103f1db9ecSBarry Smith 
113f1db9ecSBarry Smith    Collective on SNES
123f1db9ecSBarry Smith 
133f1db9ecSBarry Smith    Input Parameters:
143f1db9ecSBarry Smith +  snes - the SNES context
153f1db9ecSBarry Smith .  its - iteration number
164b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
17f55353a2SBarry Smith -  dummy -  a viewer
183f1db9ecSBarry Smith 
19ee32d87aSMatthew G. Knepley    Options Database Keys:
20ee32d87aSMatthew G. Knepley .  -snes_monitor_solution [ascii binary draw][:filename][:viewer format] - plots solution at each iteration
21ee32d87aSMatthew G. Knepley 
2236851e7fSLois Curfman McInnes    Level: intermediate
233f1db9ecSBarry Smith 
24a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView()
253f1db9ecSBarry Smith @*/
26d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorSolution(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
273f1db9ecSBarry Smith {
28dfbe8321SBarry Smith   PetscErrorCode ierr;
293f1db9ecSBarry Smith   Vec            x;
30d43b4f6eSBarry 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);
35d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
363f1db9ecSBarry Smith   ierr = VecView(x,viewer);CHKERRQ(ierr);
37d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
383f1db9ecSBarry Smith   PetscFunctionReturn(0);
393f1db9ecSBarry Smith }
403f1db9ecSBarry Smith 
415ed2d596SBarry Smith /*@C
42a6570f20SBarry Smith    SNESMonitorResidual - Monitors progress of the SNES solvers by calling
435ed2d596SBarry Smith    VecView() for the residual at each iteration.
445ed2d596SBarry Smith 
455ed2d596SBarry Smith    Collective on SNES
465ed2d596SBarry Smith 
475ed2d596SBarry Smith    Input Parameters:
485ed2d596SBarry Smith +  snes - the SNES context
495ed2d596SBarry Smith .  its - iteration number
504b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
51f55353a2SBarry Smith -  dummy -  a viewer
525ed2d596SBarry Smith 
53ee32d87aSMatthew G. Knepley    Options Database Keys:
54ee32d87aSMatthew G. Knepley .  -snes_monitor_residual [ascii binary draw][:filename][:viewer format] - plots residual (not its norm) at each iteration
55ee32d87aSMatthew G. Knepley 
565ed2d596SBarry Smith    Level: intermediate
575ed2d596SBarry Smith 
58a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView()
595ed2d596SBarry Smith @*/
60d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorResidual(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
615ed2d596SBarry Smith {
62dfbe8321SBarry Smith   PetscErrorCode ierr;
635ed2d596SBarry Smith   Vec            x;
64d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
655ed2d596SBarry Smith 
665ed2d596SBarry Smith   PetscFunctionBegin;
674d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
689e5d0892SLisandro Dalcin   ierr = SNESGetFunction(snes,&x,NULL,NULL);CHKERRQ(ierr);
69d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
705ed2d596SBarry Smith   ierr = VecView(x,viewer);CHKERRQ(ierr);
71d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
725ed2d596SBarry Smith   PetscFunctionReturn(0);
735ed2d596SBarry Smith }
745ed2d596SBarry Smith 
75d132466eSBarry Smith /*@C
76a6570f20SBarry Smith    SNESMonitorSolutionUpdate - Monitors progress of the SNES solvers by calling
77d132466eSBarry Smith    VecView() for the UPDATE to the solution at each iteration.
78d132466eSBarry Smith 
79d132466eSBarry Smith    Collective on SNES
80d132466eSBarry Smith 
81d132466eSBarry Smith    Input Parameters:
82d132466eSBarry Smith +  snes - the SNES context
83d132466eSBarry Smith .  its - iteration number
844b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
85f55353a2SBarry Smith -  dummy - a viewer
86d132466eSBarry Smith 
87ee32d87aSMatthew G. Knepley    Options Database Keys:
88ee32d87aSMatthew G. Knepley .  -snes_monitor_solution_update [ascii binary draw][:filename][:viewer format] - plots update to solution at each iteration
89ee32d87aSMatthew G. Knepley 
90d132466eSBarry Smith    Level: intermediate
91d132466eSBarry Smith 
92a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView()
93d132466eSBarry Smith @*/
94d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorSolutionUpdate(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
95d132466eSBarry Smith {
96dfbe8321SBarry Smith   PetscErrorCode ierr;
97d132466eSBarry Smith   Vec            x;
98d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
99d132466eSBarry Smith 
100d132466eSBarry Smith   PetscFunctionBegin;
1014d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
102d132466eSBarry Smith   ierr = SNESGetSolutionUpdate(snes,&x);CHKERRQ(ierr);
103d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
104d132466eSBarry Smith   ierr = VecView(x,viewer);CHKERRQ(ierr);
105d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
106d132466eSBarry Smith   PetscFunctionReturn(0);
107d132466eSBarry Smith }
108d132466eSBarry Smith 
109a5c2985bSBarry Smith /*@C
110a5c2985bSBarry Smith    KSPMonitorSNES - Print the residual norm of the nonlinear function at each iteration of the linear iterative solver.
111a5c2985bSBarry Smith 
112a5c2985bSBarry Smith    Collective on KSP
113a5c2985bSBarry Smith 
114a5c2985bSBarry Smith    Input Parameters:
115a5c2985bSBarry Smith +  ksp   - iterative context
116a5c2985bSBarry Smith .  n     - iteration number
117a5c2985bSBarry Smith .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
118a5c2985bSBarry Smith -  dummy - unused monitor context
119a5c2985bSBarry Smith 
120a5c2985bSBarry Smith    Level: intermediate
121a5c2985bSBarry Smith 
122a5c2985bSBarry Smith .seealso: KSPMonitorSet(), KSPMonitorTrueResidualNorm(), KSPMonitorLGResidualNormCreate()
123a5c2985bSBarry Smith @*/
124a5c2985bSBarry Smith PetscErrorCode  KSPMonitorSNES(KSP ksp,PetscInt n,PetscReal rnorm,void *dummy)
125a5c2985bSBarry Smith {
126a5c2985bSBarry Smith   PetscErrorCode ierr;
127a5c2985bSBarry Smith   PetscViewer    viewer;
128a5c2985bSBarry Smith   SNES           snes = (SNES) dummy;
129a5c2985bSBarry Smith   Vec            snes_solution,work1,work2;
130a5c2985bSBarry Smith   PetscReal      snorm;
131a5c2985bSBarry Smith 
132a5c2985bSBarry Smith   PetscFunctionBegin;
133a5c2985bSBarry Smith   ierr = SNESGetSolution(snes,&snes_solution);CHKERRQ(ierr);
134a5c2985bSBarry Smith   ierr = VecDuplicate(snes_solution,&work1);CHKERRQ(ierr);
135a5c2985bSBarry Smith   ierr = VecDuplicate(snes_solution,&work2);CHKERRQ(ierr);
136a5c2985bSBarry Smith   ierr = KSPBuildSolution(ksp,work1,NULL);CHKERRQ(ierr);
137a5c2985bSBarry Smith   ierr = VecAYPX(work1,-1.0,snes_solution);CHKERRQ(ierr);
138a5c2985bSBarry Smith   ierr = SNESComputeFunction(snes,work1,work2);CHKERRQ(ierr);
139a5c2985bSBarry Smith   ierr = VecNorm(work2,NORM_2,&snorm);CHKERRQ(ierr);
140a5c2985bSBarry Smith   ierr = VecDestroy(&work1);CHKERRQ(ierr);
141a5c2985bSBarry Smith   ierr = VecDestroy(&work2);CHKERRQ(ierr);
142a5c2985bSBarry Smith 
143a5c2985bSBarry Smith   ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ksp),&viewer);CHKERRQ(ierr);
144a5c2985bSBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr);
145a5c2985bSBarry Smith   if (n == 0 && ((PetscObject)ksp)->prefix) {
146a5c2985bSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  Residual norms for %s solve.\n",((PetscObject)ksp)->prefix);CHKERRQ(ierr);
147a5c2985bSBarry Smith   }
148a5c2985bSBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Residual norm %5.3e KSP Residual norm %5.3e \n",n,(double)snorm,(double)rnorm);CHKERRQ(ierr);
149a5c2985bSBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr);
150a5c2985bSBarry Smith   PetscFunctionReturn(0);
151a5c2985bSBarry Smith }
152a5c2985bSBarry Smith 
153e5f7ee39SBarry Smith #include <petscdraw.h>
154e5f7ee39SBarry Smith 
155e5f7ee39SBarry Smith /*@C
156e5f7ee39SBarry Smith    KSPMonitorSNESLGResidualNormCreate - Creates a line graph context for use with
157e5f7ee39SBarry Smith    KSP to monitor convergence of preconditioned residual norms.
158e5f7ee39SBarry Smith 
159e5f7ee39SBarry Smith    Collective on KSP
160e5f7ee39SBarry Smith 
161e5f7ee39SBarry Smith    Input Parameters:
1628b0b5a47SLisandro Dalcin +  comm - communicator context
1638b0b5a47SLisandro Dalcin .  host - the X display to open, or null for the local machine
164e5f7ee39SBarry Smith .  label - the title to put in the title bar
165e5f7ee39SBarry Smith .  x, y - the screen coordinates of the upper left coordinate of
166e5f7ee39SBarry Smith           the window
167e5f7ee39SBarry Smith -  m, n - the screen width and height in pixels
168e5f7ee39SBarry Smith 
169e5f7ee39SBarry Smith    Output Parameter:
170e5f7ee39SBarry Smith .  draw - the drawing context
171e5f7ee39SBarry Smith 
172e5f7ee39SBarry Smith    Options Database Key:
173e5f7ee39SBarry Smith .  -ksp_monitor_lg_residualnorm - Sets line graph monitor
174e5f7ee39SBarry Smith 
175e5f7ee39SBarry Smith    Notes:
176e5f7ee39SBarry Smith    Use KSPMonitorSNESLGResidualNormDestroy() to destroy this line graph; do not use PetscDrawLGDestroy().
177e5f7ee39SBarry Smith 
178e5f7ee39SBarry Smith    Level: intermediate
179e5f7ee39SBarry Smith 
180e5f7ee39SBarry Smith .seealso: KSPMonitorSNESLGResidualNormDestroy(), KSPMonitorSet(), KSPMonitorSNESLGTrueResidualCreate()
181e5f7ee39SBarry Smith @*/
1828b0b5a47SLisandro Dalcin PetscErrorCode  KSPMonitorSNESLGResidualNormCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscObject **objs)
183e5f7ee39SBarry Smith {
184e5f7ee39SBarry Smith   PetscDraw      draw;
185e5f7ee39SBarry Smith   PetscErrorCode ierr;
186e5f7ee39SBarry Smith   PetscDrawAxis  axis;
187c36cb520SLisandro Dalcin   PetscDrawLG    lg;
188e5f7ee39SBarry Smith   const char     *names[] = {"Linear residual","Nonlinear residual"};
189e5f7ee39SBarry Smith 
190e5f7ee39SBarry Smith   PetscFunctionBegin;
1918b0b5a47SLisandro Dalcin   ierr = PetscDrawCreate(comm,host,label,x,y,m,n,&draw);CHKERRQ(ierr);
192e5f7ee39SBarry Smith   ierr = PetscDrawSetFromOptions(draw);CHKERRQ(ierr);
193c36cb520SLisandro Dalcin   ierr = PetscDrawLGCreate(draw,2,&lg);CHKERRQ(ierr);
194c36cb520SLisandro Dalcin   ierr = PetscDrawLGSetLegend(lg,names);CHKERRQ(ierr);
195c36cb520SLisandro Dalcin   ierr = PetscDrawLGSetFromOptions(lg);CHKERRQ(ierr);
196c36cb520SLisandro Dalcin   ierr = PetscDrawLGGetAxis(lg,&axis);CHKERRQ(ierr);
197e5f7ee39SBarry Smith   ierr = PetscDrawAxisSetLabels(axis,"Convergence of Residual Norm","Iteration","Residual Norm");CHKERRQ(ierr);
198c36cb520SLisandro Dalcin   ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr);
199e5f7ee39SBarry Smith 
200c36cb520SLisandro Dalcin   ierr = PetscMalloc1(2,objs);CHKERRQ(ierr);
201c36cb520SLisandro Dalcin   (*objs)[1] = (PetscObject)lg;
202e5f7ee39SBarry Smith   PetscFunctionReturn(0);
203e5f7ee39SBarry Smith }
204e5f7ee39SBarry Smith 
205e5f7ee39SBarry Smith PetscErrorCode  KSPMonitorSNESLGResidualNorm(KSP ksp,PetscInt n,PetscReal rnorm,PetscObject *objs)
206e5f7ee39SBarry Smith {
207c36cb520SLisandro Dalcin   SNES           snes = (SNES) objs[0];
208e5f7ee39SBarry Smith   PetscDrawLG    lg   = (PetscDrawLG) objs[1];
209e5f7ee39SBarry Smith   PetscErrorCode ierr;
210e5f7ee39SBarry Smith   PetscReal      y[2];
211e5f7ee39SBarry Smith   Vec            snes_solution,work1,work2;
212e5f7ee39SBarry Smith 
213e5f7ee39SBarry Smith   PetscFunctionBegin;
214e5f7ee39SBarry Smith   if (rnorm > 0.0) y[0] = PetscLog10Real(rnorm);
215e5f7ee39SBarry Smith   else y[0] = -15.0;
216e5f7ee39SBarry Smith 
217e5f7ee39SBarry Smith   ierr = SNESGetSolution(snes,&snes_solution);CHKERRQ(ierr);
218e5f7ee39SBarry Smith   ierr = VecDuplicate(snes_solution,&work1);CHKERRQ(ierr);
219e5f7ee39SBarry Smith   ierr = VecDuplicate(snes_solution,&work2);CHKERRQ(ierr);
220e5f7ee39SBarry Smith   ierr = KSPBuildSolution(ksp,work1,NULL);CHKERRQ(ierr);
221e5f7ee39SBarry Smith   ierr = VecAYPX(work1,-1.0,snes_solution);CHKERRQ(ierr);
222e5f7ee39SBarry Smith   ierr = SNESComputeFunction(snes,work1,work2);CHKERRQ(ierr);
223e5f7ee39SBarry Smith   ierr = VecNorm(work2,NORM_2,y+1);CHKERRQ(ierr);
224e5f7ee39SBarry Smith   if (y[1] > 0.0) y[1] = PetscLog10Real(y[1]);
225e5f7ee39SBarry Smith   else y[1] = -15.0;
226e5f7ee39SBarry Smith   ierr = VecDestroy(&work1);CHKERRQ(ierr);
227e5f7ee39SBarry Smith   ierr = VecDestroy(&work2);CHKERRQ(ierr);
228e5f7ee39SBarry Smith 
229e5f7ee39SBarry Smith   ierr = PetscDrawLGAddPoint(lg,NULL,y);CHKERRQ(ierr);
2306934998bSLisandro Dalcin   if (n < 20 || !(n % 5) || snes->reason) {
231e5f7ee39SBarry Smith     ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr);
2326934998bSLisandro Dalcin     ierr = PetscDrawLGSave(lg);CHKERRQ(ierr);
233e5f7ee39SBarry Smith   }
234e5f7ee39SBarry Smith   PetscFunctionReturn(0);
235e5f7ee39SBarry Smith }
236e5f7ee39SBarry Smith 
237e5f7ee39SBarry Smith /*@
238e5f7ee39SBarry Smith    KSPMonitorSNESLGResidualNormDestroy - Destroys a line graph context that was created
239e5f7ee39SBarry Smith    with KSPMonitorSNESLGResidualNormCreate().
240e5f7ee39SBarry Smith 
241e5f7ee39SBarry Smith    Collective on KSP
242e5f7ee39SBarry Smith 
243e5f7ee39SBarry Smith    Input Parameter:
244e5f7ee39SBarry Smith .  draw - the drawing context
245e5f7ee39SBarry Smith 
246e5f7ee39SBarry Smith    Level: intermediate
247e5f7ee39SBarry Smith 
248e5f7ee39SBarry Smith .seealso: KSPMonitorSNESLGResidualNormCreate(), KSPMonitorSNESLGTrueResidualDestroy(), KSPMonitorSet()
249e5f7ee39SBarry Smith @*/
250e5f7ee39SBarry Smith PetscErrorCode  KSPMonitorSNESLGResidualNormDestroy(PetscObject **objs)
251e5f7ee39SBarry Smith {
252e5f7ee39SBarry Smith   PetscErrorCode ierr;
253c36cb520SLisandro Dalcin   PetscDrawLG    lg = (PetscDrawLG) (*objs)[1];
254e5f7ee39SBarry Smith 
255e5f7ee39SBarry Smith   PetscFunctionBegin;
256c36cb520SLisandro Dalcin   ierr = PetscDrawLGDestroy(&lg);CHKERRQ(ierr);
257e5f7ee39SBarry Smith   ierr = PetscFree(*objs);CHKERRQ(ierr);
258e5f7ee39SBarry Smith   PetscFunctionReturn(0);
259e5f7ee39SBarry Smith }
260e5f7ee39SBarry Smith 
2614b828684SBarry Smith /*@C
262a6570f20SBarry Smith    SNESMonitorDefault - Monitors progress of the SNES solvers (default).
263e7e93795SLois Curfman McInnes 
264c7afd0dbSLois Curfman McInnes    Collective on SNES
265c7afd0dbSLois Curfman McInnes 
266e7e93795SLois Curfman McInnes    Input Parameters:
267c7afd0dbSLois Curfman McInnes +  snes - the SNES context
268e7e93795SLois Curfman McInnes .  its - iteration number
2694b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
270d43b4f6eSBarry Smith -  vf - viewer and format structure
271fee21e36SBarry Smith 
272e7e93795SLois Curfman McInnes    Notes:
2734b27c08aSLois Curfman McInnes    This routine prints the residual norm at each iteration.
274e7e93795SLois Curfman McInnes 
27536851e7fSLois Curfman McInnes    Level: intermediate
27636851e7fSLois Curfman McInnes 
277a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution()
278e7e93795SLois Curfman McInnes @*/
279d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorDefault(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
280e7e93795SLois Curfman McInnes {
281dfbe8321SBarry Smith   PetscErrorCode ierr;
282d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
283d132466eSBarry Smith 
2843a40ed3dSBarry Smith   PetscFunctionBegin;
2854d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
286d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
287649052a6SBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
288649052a6SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e \n",its,(double)fgnorm);CHKERRQ(ierr);
289649052a6SBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
290d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
2913a40ed3dSBarry Smith   PetscFunctionReturn(0);
292e7e93795SLois Curfman McInnes }
2933f1db9ecSBarry Smith 
2941f60017eSBarry Smith /*@C
2951f60017eSBarry Smith    SNESMonitorScaling - Monitors the largest value in each row of the Jacobian.
2961f60017eSBarry Smith 
2971f60017eSBarry Smith    Collective on SNES
2981f60017eSBarry Smith 
2991f60017eSBarry Smith    Input Parameters:
3001f60017eSBarry Smith +  snes - the SNES context
3011f60017eSBarry Smith .  its - iteration number
3021f60017eSBarry Smith .  fgnorm - 2-norm of residual
3031f60017eSBarry Smith -  vf - viewer and format structure
3041f60017eSBarry Smith 
3051f60017eSBarry Smith    Notes:
3061f60017eSBarry Smith    This routine prints the largest value in each row of the Jacobian
3071f60017eSBarry Smith 
3081f60017eSBarry Smith    Level: intermediate
3091f60017eSBarry Smith 
3101f60017eSBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution()
3111f60017eSBarry Smith @*/
3121f60017eSBarry Smith PetscErrorCode  SNESMonitorScaling(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
3131f60017eSBarry Smith {
3141f60017eSBarry Smith   PetscErrorCode ierr;
3151f60017eSBarry Smith   PetscViewer    viewer = vf->viewer;
3161f60017eSBarry Smith   KSP            ksp;
3171f60017eSBarry Smith   Mat            J;
3181f60017eSBarry Smith   Vec            v;
3191f60017eSBarry Smith 
3201f60017eSBarry Smith   PetscFunctionBegin;
3211f60017eSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
3221f60017eSBarry Smith   ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
3231f60017eSBarry Smith   ierr = KSPGetOperators(ksp,&J,NULL);CHKERRQ(ierr);
3241f60017eSBarry Smith   ierr = MatCreateVecs(J,&v,NULL);CHKERRQ(ierr);
3251f60017eSBarry Smith   ierr = MatGetRowMaxAbs(J,v,NULL);CHKERRQ(ierr);
3261f60017eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
3271f60017eSBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
3281f60017eSBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Jacobian maximum row entries \n");CHKERRQ(ierr);
3291f60017eSBarry Smith   ierr = VecView(v,viewer);CHKERRQ(ierr);
3301f60017eSBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
3311f60017eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
3321f60017eSBarry Smith   ierr = VecDestroy(&v);CHKERRQ(ierr);
3331f60017eSBarry Smith   PetscFunctionReturn(0);
3341f60017eSBarry Smith }
3351f60017eSBarry Smith 
336d43b4f6eSBarry Smith PetscErrorCode SNESMonitorJacUpdateSpectrum(SNES snes,PetscInt it,PetscReal fnorm,PetscViewerAndFormat *vf)
337a80ad3e0SBarry Smith {
3383c377650SSatish Balay #if defined(PETSC_HAVE_ESSL)
339ce94432eSBarry Smith   SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_SUP,"GEEV - No support for ESSL Lapack Routines");
340196da8b6SPeter Brune #else
3412e7541e6SPeter Brune   Vec            X;
3422e7541e6SPeter Brune   Mat            J,dJ,dJdense;
3432e7541e6SPeter Brune   PetscErrorCode ierr;
344d1e9a80fSBarry Smith   PetscErrorCode (*func)(SNES,Vec,Mat,Mat,void*);
345*2f96bde4SJose E. Roman   PetscInt       n;
34623fff9afSBarry Smith   PetscBLASInt   nb = 0,lwork;
3472e7541e6SPeter Brune   PetscReal      *eigr,*eigi;
3482e7541e6SPeter Brune   PetscScalar    *work;
3492e7541e6SPeter Brune   PetscScalar    *a;
3502e7541e6SPeter Brune 
3512e7541e6SPeter Brune   PetscFunctionBegin;
3522e7541e6SPeter Brune   if (it == 0) PetscFunctionReturn(0);
3532e7541e6SPeter Brune   /* create the difference between the current update and the current jacobian */
3542e7541e6SPeter Brune   ierr = SNESGetSolution(snes,&X);CHKERRQ(ierr);
355d1e9a80fSBarry Smith   ierr = SNESGetJacobian(snes,NULL,&J,&func,NULL);CHKERRQ(ierr);
3562e7541e6SPeter Brune   ierr = MatDuplicate(J,MAT_COPY_VALUES,&dJ);CHKERRQ(ierr);
357d1e9a80fSBarry Smith   ierr = SNESComputeJacobian(snes,X,dJ,dJ);CHKERRQ(ierr);
3582e7541e6SPeter Brune   ierr = MatAXPY(dJ,-1.0,J,SAME_NONZERO_PATTERN);CHKERRQ(ierr);
359f5af7f23SKarl Rupp 
3602e7541e6SPeter Brune   /* compute the spectrum directly */
3612e7541e6SPeter Brune   ierr  = MatConvert(dJ,MATSEQDENSE,MAT_INITIAL_MATRIX,&dJdense);CHKERRQ(ierr);
3620298fd71SBarry Smith   ierr  = MatGetSize(dJ,&n,NULL);CHKERRQ(ierr);
363c5df96a5SBarry Smith   ierr  = PetscBLASIntCast(n,&nb);CHKERRQ(ierr);
3642e7541e6SPeter Brune   lwork = 3*nb;
365785e854fSJed Brown   ierr  = PetscMalloc1(n,&eigr);CHKERRQ(ierr);
366785e854fSJed Brown   ierr  = PetscMalloc1(n,&eigi);CHKERRQ(ierr);
367785e854fSJed Brown   ierr  = PetscMalloc1(lwork,&work);CHKERRQ(ierr);
3688c778c55SBarry Smith   ierr  = MatDenseGetArray(dJdense,&a);CHKERRQ(ierr);
3692e7541e6SPeter Brune #if !defined(PETSC_USE_COMPLEX)
3702e7541e6SPeter Brune   {
3712e7541e6SPeter Brune     PetscBLASInt lierr;
372*2f96bde4SJose E. Roman     PetscInt     i;
3732e7541e6SPeter Brune     ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
3748b83055fSJed Brown     PetscStackCallBLAS("LAPACKgeev",LAPACKgeev_("N","N",&nb,a,&nb,eigr,eigi,NULL,&nb,NULL,&nb,work,&lwork,&lierr));
3752e7541e6SPeter Brune     if (lierr) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"geev() error %d",lierr);
3762e7541e6SPeter Brune     ierr = PetscFPTrapPop();CHKERRQ(ierr);
377fde5950dSBarry Smith     ierr = PetscPrintf(PetscObjectComm((PetscObject)snes),"Eigenvalues of J_%d - J_%d:\n",it,it-1);CHKERRQ(ierr);
3782e7541e6SPeter Brune     for (i=0;i<n;i++) {
379fde5950dSBarry Smith       ierr = PetscPrintf(PetscObjectComm((PetscObject)snes),"%5d: %20.5g + %20.5gi\n",i,(double)eigr[i],(double)eigi[i]);CHKERRQ(ierr);
3802e7541e6SPeter Brune     }
381*2f96bde4SJose E. Roman   }
3828c778c55SBarry Smith   ierr = MatDenseRestoreArray(dJdense,&a);CHKERRQ(ierr);
3832e7541e6SPeter Brune   ierr = MatDestroy(&dJ);CHKERRQ(ierr);
3842e7541e6SPeter Brune   ierr = MatDestroy(&dJdense);CHKERRQ(ierr);
3852e7541e6SPeter Brune   ierr = PetscFree(eigr);CHKERRQ(ierr);
3862e7541e6SPeter Brune   ierr = PetscFree(eigi);CHKERRQ(ierr);
3872e7541e6SPeter Brune   ierr = PetscFree(work);CHKERRQ(ierr);
3882e7541e6SPeter Brune   PetscFunctionReturn(0);
389*2f96bde4SJose E. Roman #else
390*2f96bde4SJose E. Roman   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Not coded for complex");
391*2f96bde4SJose E. Roman #endif
392196da8b6SPeter Brune #endif
3932e7541e6SPeter Brune }
3942e7541e6SPeter Brune 
3956ba87a44SLisandro Dalcin PETSC_INTERN PetscErrorCode  SNESMonitorRange_Private(SNES,PetscInt,PetscReal*);
3966ba87a44SLisandro Dalcin 
3977087cfbeSBarry Smith PetscErrorCode  SNESMonitorRange_Private(SNES snes,PetscInt it,PetscReal *per)
398b271bb04SBarry Smith {
399b271bb04SBarry Smith   PetscErrorCode ierr;
400b271bb04SBarry Smith   Vec            resid;
401b271bb04SBarry Smith   PetscReal      rmax,pwork;
402b271bb04SBarry Smith   PetscInt       i,n,N;
403b271bb04SBarry Smith   PetscScalar    *r;
404b271bb04SBarry Smith 
405b271bb04SBarry Smith   PetscFunctionBegin;
4069e5d0892SLisandro Dalcin   ierr  = SNESGetFunction(snes,&resid,NULL,NULL);CHKERRQ(ierr);
407b271bb04SBarry Smith   ierr  = VecNorm(resid,NORM_INFINITY,&rmax);CHKERRQ(ierr);
408b271bb04SBarry Smith   ierr  = VecGetLocalSize(resid,&n);CHKERRQ(ierr);
409b271bb04SBarry Smith   ierr  = VecGetSize(resid,&N);CHKERRQ(ierr);
410b271bb04SBarry Smith   ierr  = VecGetArray(resid,&r);CHKERRQ(ierr);
411b271bb04SBarry Smith   pwork = 0.0;
412b271bb04SBarry Smith   for (i=0; i<n; i++) {
413b271bb04SBarry Smith     pwork += (PetscAbsScalar(r[i]) > .20*rmax);
414b271bb04SBarry Smith   }
415b2566f29SBarry Smith   ierr = MPIU_Allreduce(&pwork,per,1,MPIU_REAL,MPIU_SUM,PetscObjectComm((PetscObject)snes));CHKERRQ(ierr);
416b271bb04SBarry Smith   ierr = VecRestoreArray(resid,&r);CHKERRQ(ierr);
417b271bb04SBarry Smith   *per = *per/N;
418b271bb04SBarry Smith   PetscFunctionReturn(0);
419b271bb04SBarry Smith }
420b271bb04SBarry Smith 
421b271bb04SBarry Smith /*@C
422b271bb04SBarry Smith    SNESMonitorRange - Prints the percentage of residual elements that are more then 10 percent of the maximum value.
423b271bb04SBarry Smith 
424b271bb04SBarry Smith    Collective on SNES
425b271bb04SBarry Smith 
426b271bb04SBarry Smith    Input Parameters:
427b271bb04SBarry Smith +  snes   - iterative context
428b271bb04SBarry Smith .  it    - iteration number
429b271bb04SBarry Smith .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
430b271bb04SBarry Smith -  dummy - unused monitor context
431b271bb04SBarry Smith 
432b271bb04SBarry Smith    Options Database Key:
433b271bb04SBarry Smith .  -snes_monitor_range - Activates SNESMonitorRange()
434b271bb04SBarry Smith 
435b271bb04SBarry Smith    Level: intermediate
436b271bb04SBarry Smith 
437b271bb04SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), SNESMonitorLGCreate()
438b271bb04SBarry Smith @*/
439d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorRange(SNES snes,PetscInt it,PetscReal rnorm,PetscViewerAndFormat *vf)
440b271bb04SBarry Smith {
441b271bb04SBarry Smith   PetscErrorCode ierr;
442b271bb04SBarry Smith   PetscReal      perc,rel;
443d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
444b271bb04SBarry Smith   /* should be in a MonitorRangeContext */
445b271bb04SBarry Smith   static PetscReal prev;
446b271bb04SBarry Smith 
447b271bb04SBarry Smith   PetscFunctionBegin;
4484d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
449b271bb04SBarry Smith   if (!it) prev = rnorm;
450b271bb04SBarry Smith   ierr = SNESMonitorRange_Private(snes,it,&perc);CHKERRQ(ierr);
451b271bb04SBarry Smith 
452b271bb04SBarry Smith   rel  = (prev - rnorm)/prev;
453b271bb04SBarry Smith   prev = rnorm;
454d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
455649052a6SBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
4566712e2f1SBarry 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);
457649052a6SBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
458d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
459b271bb04SBarry Smith   PetscFunctionReturn(0);
460b271bb04SBarry Smith }
461b271bb04SBarry Smith 
4623a7fca6bSBarry Smith /*@C
463a6570f20SBarry Smith    SNESMonitorRatio - Monitors progress of the SNES solvers by printing the ratio
4644b27c08aSLois Curfman McInnes    of residual norm at each iteration to the previous.
4653a7fca6bSBarry Smith 
4663a7fca6bSBarry Smith    Collective on SNES
4673a7fca6bSBarry Smith 
4683a7fca6bSBarry Smith    Input Parameters:
4693a7fca6bSBarry Smith +  snes - the SNES context
4703a7fca6bSBarry Smith .  its - iteration number
4713a7fca6bSBarry Smith .  fgnorm - 2-norm of residual (or gradient)
472eabae89aSBarry Smith -  dummy -  context of monitor
4733a7fca6bSBarry Smith 
4743a7fca6bSBarry Smith    Level: intermediate
4753a7fca6bSBarry Smith 
47695452b02SPatrick Sanan    Notes:
47795452b02SPatrick Sanan     Insure that SNESMonitorRatio() is called when you set this monitor
478fde5950dSBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorRatio()
4793a7fca6bSBarry Smith @*/
480d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorRatio(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
4813a7fca6bSBarry Smith {
482dfbe8321SBarry Smith   PetscErrorCode          ierr;
48377431f27SBarry Smith   PetscInt                len;
48487828ca2SBarry Smith   PetscReal               *history;
485d43b4f6eSBarry Smith   PetscViewer             viewer = vf->viewer;
4863a7fca6bSBarry Smith 
4873a7fca6bSBarry Smith   PetscFunctionBegin;
4880298fd71SBarry Smith   ierr = SNESGetConvergenceHistory(snes,&history,NULL,&len);CHKERRQ(ierr);
489d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
490fde5950dSBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
491958c9bccSBarry Smith   if (!its || !history || its > len) {
492fde5950dSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e \n",its,(double)fgnorm);CHKERRQ(ierr);
4933a7fca6bSBarry Smith   } else {
49487828ca2SBarry Smith     PetscReal ratio = fgnorm/history[its-1];
495fde5950dSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e %14.12e \n",its,(double)fgnorm,(double)ratio);CHKERRQ(ierr);
4963a7fca6bSBarry Smith   }
497fde5950dSBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
498d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
4993a7fca6bSBarry Smith   PetscFunctionReturn(0);
5003a7fca6bSBarry Smith }
5013a7fca6bSBarry Smith 
5023a7fca6bSBarry Smith /*@C
503fde5950dSBarry Smith    SNESMonitorRatioSetUp - Insures the SNES object is saving its history since this monitor needs access to it
5043a7fca6bSBarry Smith 
5053a7fca6bSBarry Smith    Collective on SNES
5063a7fca6bSBarry Smith 
5073a7fca6bSBarry Smith    Input Parameters:
508eabae89aSBarry Smith +   snes - the SNES context
509fde5950dSBarry Smith -   viewer - the PetscViewer object (ignored)
5103a7fca6bSBarry Smith 
5113a7fca6bSBarry Smith    Level: intermediate
5123a7fca6bSBarry Smith 
513fde5950dSBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault(), SNESMonitorRatio()
5143a7fca6bSBarry Smith @*/
515d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorRatioSetUp(SNES snes,PetscViewerAndFormat *vf)
5163a7fca6bSBarry Smith {
517dfbe8321SBarry Smith   PetscErrorCode          ierr;
51887828ca2SBarry Smith   PetscReal               *history;
5193a7fca6bSBarry Smith 
5203a7fca6bSBarry Smith   PetscFunctionBegin;
5210298fd71SBarry Smith   ierr = SNESGetConvergenceHistory(snes,&history,NULL,NULL);CHKERRQ(ierr);
5223a7fca6bSBarry Smith   if (!history) {
523fde5950dSBarry Smith     ierr = SNESSetConvergenceHistory(snes,NULL,NULL,100,PETSC_TRUE);CHKERRQ(ierr);
5243a7fca6bSBarry Smith   }
5253a7fca6bSBarry Smith   PetscFunctionReturn(0);
5263a7fca6bSBarry Smith }
5273a7fca6bSBarry Smith 
528e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */
529be1f7002SBarry Smith /*
530a6570f20SBarry Smith      Default (short) SNES Monitor, same as SNESMonitorDefault() except
531be1f7002SBarry Smith   it prints fewer digits of the residual as the residual gets smaller.
532be1f7002SBarry Smith   This is because the later digits are meaningless and are often
533be1f7002SBarry Smith   different on different machines; by using this routine different
534be1f7002SBarry Smith   machines will usually generate the same output.
535dec21524SBarry Smith 
536dec21524SBarry Smith   Deprecated: Intentionally has no manual page
537be1f7002SBarry Smith */
538d43b4f6eSBarry Smith PetscErrorCode  SNESMonitorDefaultShort(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf)
539e7e93795SLois Curfman McInnes {
540dfbe8321SBarry Smith   PetscErrorCode ierr;
541d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
542d132466eSBarry Smith 
5433a40ed3dSBarry Smith   PetscFunctionBegin;
5444d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
545d43b4f6eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
546649052a6SBarry Smith   ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
5478f240d10SBarry Smith   if (fgnorm > 1.e-9) {
5488fa295daSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %g \n",its,(double)fgnorm);CHKERRQ(ierr);
5493a40ed3dSBarry Smith   } else if (fgnorm > 1.e-11) {
5508fa295daSBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %5.3e \n",its,(double)fgnorm);CHKERRQ(ierr);
5513a40ed3dSBarry Smith   } else {
552649052a6SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm < 1.e-11\n",its);CHKERRQ(ierr);
553a34d58ebSBarry Smith   }
554649052a6SBarry Smith   ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr);
555d43b4f6eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
5563a40ed3dSBarry Smith   PetscFunctionReturn(0);
557e7e93795SLois Curfman McInnes }
5582db13446SMatthew G. Knepley 
5592db13446SMatthew G. Knepley /*@C
5602db13446SMatthew G. Knepley   SNESMonitorDefaultField - Monitors progress of the SNES solvers, separated into fields.
5612db13446SMatthew G. Knepley 
5622db13446SMatthew G. Knepley   Collective on SNES
5632db13446SMatthew G. Knepley 
5642db13446SMatthew G. Knepley   Input Parameters:
5652db13446SMatthew G. Knepley + snes   - the SNES context
5662db13446SMatthew G. Knepley . its    - iteration number
5672db13446SMatthew G. Knepley . fgnorm - 2-norm of residual
5682db13446SMatthew G. Knepley - ctx    - the PetscViewer
5692db13446SMatthew G. Knepley 
5702db13446SMatthew G. Knepley   Notes:
5712db13446SMatthew G. Knepley   This routine uses the DM attached to the residual vector
5722db13446SMatthew G. Knepley 
5732db13446SMatthew G. Knepley   Level: intermediate
5742db13446SMatthew G. Knepley 
575dec21524SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault()
5762db13446SMatthew G. Knepley @*/
577d43b4f6eSBarry Smith PetscErrorCode SNESMonitorDefaultField(SNES snes, PetscInt its, PetscReal fgnorm, PetscViewerAndFormat *vf)
5782db13446SMatthew G. Knepley {
579d43b4f6eSBarry Smith   PetscViewer    viewer = vf->viewer;
5802db13446SMatthew G. Knepley   Vec            r;
5812db13446SMatthew G. Knepley   DM             dm;
5822db13446SMatthew G. Knepley   PetscReal      res[256];
5832db13446SMatthew G. Knepley   PetscInt       tablevel;
5842db13446SMatthew G. Knepley   PetscErrorCode ierr;
5852db13446SMatthew G. Knepley 
5862db13446SMatthew G. Knepley   PetscFunctionBegin;
5874d4332d5SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
5882db13446SMatthew G. Knepley   ierr = SNESGetFunction(snes, &r, NULL, NULL);CHKERRQ(ierr);
5892db13446SMatthew G. Knepley   ierr = VecGetDM(r, &dm);CHKERRQ(ierr);
590d43b4f6eSBarry Smith   if (!dm) {ierr = SNESMonitorDefault(snes, its, fgnorm, vf);CHKERRQ(ierr);}
5912db13446SMatthew G. Knepley   else {
5922db13446SMatthew G. Knepley     PetscSection s, gs;
5932db13446SMatthew G. Knepley     PetscInt     Nf, f;
5942db13446SMatthew G. Knepley 
59592fd8e1eSJed Brown     ierr = DMGetLocalSection(dm, &s);CHKERRQ(ierr);
596e87a4003SBarry Smith     ierr = DMGetGlobalSection(dm, &gs);CHKERRQ(ierr);
597d43b4f6eSBarry Smith     if (!s || !gs) {ierr = SNESMonitorDefault(snes, its, fgnorm, vf);CHKERRQ(ierr);}
5982db13446SMatthew G. Knepley     ierr = PetscSectionGetNumFields(s, &Nf);CHKERRQ(ierr);
5992db13446SMatthew G. Knepley     if (Nf > 256) SETERRQ1(PetscObjectComm((PetscObject) snes), PETSC_ERR_SUP, "Do not support %d fields > 256", Nf);
6002db13446SMatthew G. Knepley     ierr = PetscSectionVecNorm(s, gs, r, NORM_2, res);CHKERRQ(ierr);
6012db13446SMatthew G. Knepley     ierr = PetscObjectGetTabLevel((PetscObject) snes, &tablevel);CHKERRQ(ierr);
602d43b4f6eSBarry Smith     ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
6032db13446SMatthew G. Knepley     ierr = PetscViewerASCIIAddTab(viewer, tablevel);CHKERRQ(ierr);
6042db13446SMatthew G. Knepley     ierr = PetscViewerASCIIPrintf(viewer, "%3D SNES Function norm %14.12e [", its, (double) fgnorm);CHKERRQ(ierr);
6052db13446SMatthew G. Knepley     for (f = 0; f < Nf; ++f) {
6062db13446SMatthew G. Knepley       if (f) {ierr = PetscViewerASCIIPrintf(viewer, ", ");CHKERRQ(ierr);}
6072db13446SMatthew G. Knepley       ierr = PetscViewerASCIIPrintf(viewer, "%14.12e", res[f]);CHKERRQ(ierr);
6082db13446SMatthew G. Knepley     }
6092db13446SMatthew G. Knepley     ierr = PetscViewerASCIIPrintf(viewer, "] \n");CHKERRQ(ierr);
6102db13446SMatthew G. Knepley     ierr = PetscViewerASCIISubtractTab(viewer, tablevel);CHKERRQ(ierr);
611d43b4f6eSBarry Smith     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
6122db13446SMatthew G. Knepley   }
6132db13446SMatthew G. Knepley   PetscFunctionReturn(0);
6142db13446SMatthew G. Knepley }
615e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */
6164b828684SBarry Smith /*@C
617c34cbdceSBarry Smith    SNESConvergedDefault - Default onvergence test of the solvers for
618c34cbdceSBarry Smith    systems of nonlinear equations.
619e7e93795SLois Curfman McInnes 
620c7afd0dbSLois Curfman McInnes    Collective on SNES
621c7afd0dbSLois Curfman McInnes 
622e7e93795SLois Curfman McInnes    Input Parameters:
623c7afd0dbSLois Curfman McInnes +  snes - the SNES context
62406ee9f85SBarry Smith .  it - the iteration (0 indicates before any Newton steps)
625e7e93795SLois Curfman McInnes .  xnorm - 2-norm of current iterate
626c60f73f4SPeter Brune .  snorm - 2-norm of current step
6277f3332b4SBarry Smith .  fnorm - 2-norm of function at current iterate
628c7afd0dbSLois Curfman McInnes -  dummy - unused context
629e7e93795SLois Curfman McInnes 
630184914b5SBarry Smith    Output Parameter:
631184914b5SBarry Smith .   reason  - one of
63270441072SBarry Smith $  SNES_CONVERGED_FNORM_ABS       - (fnorm < abstol),
633c60f73f4SPeter Brune $  SNES_CONVERGED_SNORM_RELATIVE  - (snorm < stol*xnorm),
634184914b5SBarry Smith $  SNES_CONVERGED_FNORM_RELATIVE  - (fnorm < rtol*fnorm0),
635184914b5SBarry Smith $  SNES_DIVERGED_FUNCTION_COUNT   - (nfct > maxf),
636184914b5SBarry Smith $  SNES_DIVERGED_FNORM_NAN        - (fnorm == NaN),
637184914b5SBarry Smith $  SNES_CONVERGED_ITERATING       - (otherwise),
638c34cbdceSBarry Smith $  SNES_DIVERGED_DTOL             - (fnorm > divtol*snes->fnorm0)
639e7e93795SLois Curfman McInnes 
640e7e93795SLois Curfman McInnes    where
641c34cbdceSBarry Smith +    maxf - maximum number of function evaluations,  set with SNESSetTolerances()
642c7afd0dbSLois Curfman McInnes .    nfct - number of function evaluations,
643c34cbdceSBarry Smith .    abstol - absolute function norm tolerance, set with SNESSetTolerances()
644c34cbdceSBarry Smith .    rtol - relative function norm tolerance, set with SNESSetTolerances()
645c34cbdceSBarry Smith .    divtol - divergence tolerance, set with SNESSetDivergenceTolerance()
646c34cbdceSBarry Smith -    fnorm0 - 2-norm of the function at the initial solution (initial guess; zeroth iteration)
647c34cbdceSBarry Smith 
648c34cbdceSBarry Smith   Options Database Keys:
6495c50d39aSSatish Balay +  -snes_stol - convergence tolerance in terms of the norm  of the change in the solution between steps
650c34cbdceSBarry Smith .  -snes_atol <abstol> - absolute tolerance of residual norm
651c34cbdceSBarry Smith .  -snes_rtol <rtol> - relative decrease in tolerance norm from the initial 2-norm of the solution
652c34cbdceSBarry Smith .  -snes_divergence_tolerance <divtol> - if the residual goes above divtol*rnorm0, exit with divergence
653c34cbdceSBarry Smith .  -snes_max_funcs <max_funcs> - maximum number of function evaluations
654c34cbdceSBarry Smith .  -snes_max_fail <max_fail> - maximum number of line search failures allowed before stopping, default is none
655c34cbdceSBarry Smith -  -snes_max_linear_solve_fail - number of linear solver failures before SNESSolve() stops
656fee21e36SBarry Smith 
65736851e7fSLois Curfman McInnes    Level: intermediate
65836851e7fSLois Curfman McInnes 
659649ef022SMatthew Knepley .seealso: SNESSetConvergenceTest(), SNESConvergedSkip(), SNESSetTolerances(), SNESSetDivergenceTolerance()
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;
679be5caee7SBarry Smith   } else if (fnorm < snes->abstol && (it || !snes->forceiteration)) {
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;
682e71169deSBarry Smith   } else if (snes->nfuncs >= snes->max_funcs && snes->max_funcs >= 0) {
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 /*@C
704e2a6519dSDmitry Karpeev    SNESConvergedSkip - Convergence test for SNES that NEVER returns as
7053f149594SLisandro Dalcin    converged, UNLESS the maximum number of iteration have been reached.
7063f149594SLisandro Dalcin 
7073f9fe445SBarry Smith    Logically Collective on SNES
7083f149594SLisandro Dalcin 
7093f149594SLisandro Dalcin    Input Parameters:
7103f149594SLisandro Dalcin +  snes - the SNES context
7113f149594SLisandro Dalcin .  it - the iteration (0 indicates before any Newton steps)
7123f149594SLisandro Dalcin .  xnorm - 2-norm of current iterate
713c60f73f4SPeter Brune .  snorm - 2-norm of current step
7143f149594SLisandro Dalcin .  fnorm - 2-norm of function at current iterate
7153f149594SLisandro Dalcin -  dummy - unused context
7163f149594SLisandro Dalcin 
7173f149594SLisandro Dalcin    Output Parameter:
71885385478SLisandro Dalcin .   reason  - SNES_CONVERGED_ITERATING, SNES_CONVERGED_ITS, or SNES_DIVERGED_FNORM_NAN
7193f149594SLisandro Dalcin 
7203f149594SLisandro Dalcin    Notes:
7213f149594SLisandro Dalcin    Convergence is then declared after a fixed number of iterations have been used.
7223f149594SLisandro Dalcin 
7233f149594SLisandro Dalcin    Level: advanced
7243f149594SLisandro Dalcin 
725649ef022SMatthew Knepley .seealso: SNESConvergedDefault(), SNESSetConvergenceTest()
7263f149594SLisandro Dalcin @*/
727e2a6519dSDmitry Karpeev PetscErrorCode  SNESConvergedSkip(SNES snes,PetscInt it,PetscReal xnorm,PetscReal snorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy)
7283f149594SLisandro Dalcin {
7293f149594SLisandro Dalcin   PetscErrorCode ierr;
7303f149594SLisandro Dalcin 
7313f149594SLisandro Dalcin   PetscFunctionBegin;
7320700a824SBarry Smith   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
7333f149594SLisandro Dalcin   PetscValidPointer(reason,6);
7343f149594SLisandro Dalcin 
7353f149594SLisandro Dalcin   *reason = SNES_CONVERGED_ITERATING;
7363f149594SLisandro Dalcin 
7373f149594SLisandro Dalcin   if (fnorm != fnorm) {
7383f149594SLisandro Dalcin     ierr    = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr);
7393f149594SLisandro Dalcin     *reason = SNES_DIVERGED_FNORM_NAN;
7403f149594SLisandro Dalcin   } else if (it == snes->max_its) {
7413f149594SLisandro Dalcin     *reason = SNES_CONVERGED_ITS;
7423f149594SLisandro Dalcin   }
7433f149594SLisandro Dalcin   PetscFunctionReturn(0);
7443f149594SLisandro Dalcin }
7453f149594SLisandro Dalcin 
7468d359177SBarry Smith /*@C
747fa0ddf94SBarry Smith   SNESSetWorkVecs - Gets a number of work vectors.
74858c9b817SLisandro Dalcin 
74958c9b817SLisandro Dalcin   Input Parameters:
750a2b725a8SWilliam Gropp + snes  - the SNES context
751a2b725a8SWilliam Gropp - nw - number of work vectors to allocate
75258c9b817SLisandro Dalcin 
75358c9b817SLisandro Dalcin   Level: developer
754fa0ddf94SBarry Smith 
75598acb6afSMatthew G Knepley @*/
756fa0ddf94SBarry Smith PetscErrorCode SNESSetWorkVecs(SNES snes,PetscInt nw)
75758c9b817SLisandro Dalcin {
758c5ed8070SMatthew G. Knepley   DM             dm;
759c5ed8070SMatthew G. Knepley   Vec            v;
76058c9b817SLisandro Dalcin   PetscErrorCode ierr;
76158c9b817SLisandro Dalcin 
76258c9b817SLisandro Dalcin   PetscFunctionBegin;
76358c9b817SLisandro Dalcin   if (snes->work) {ierr = VecDestroyVecs(snes->nwork,&snes->work);CHKERRQ(ierr);}
76458c9b817SLisandro Dalcin   snes->nwork = nw;
765f5af7f23SKarl Rupp 
766c5ed8070SMatthew G. Knepley   ierr = SNESGetDM(snes, &dm);CHKERRQ(ierr);
767c5ed8070SMatthew G. Knepley   ierr = DMGetGlobalVector(dm, &v);CHKERRQ(ierr);
768c5ed8070SMatthew G. Knepley   ierr = VecDuplicateVecs(v,snes->nwork,&snes->work);CHKERRQ(ierr);
769c5ed8070SMatthew G. Knepley   ierr = DMRestoreGlobalVector(dm, &v);CHKERRQ(ierr);
77058c9b817SLisandro Dalcin   ierr = PetscLogObjectParents(snes,nw,snes->work);CHKERRQ(ierr);
77158c9b817SLisandro Dalcin   PetscFunctionReturn(0);
77258c9b817SLisandro Dalcin }
773