xref: /petsc/src/snes/interface/snesut.c (revision b271bb04eaec0d477b629c8be871cf42cb4980f5)
163dd3a1aSKris Buschelman #define PETSCSNES_DLL
2e7e93795SLois Curfman McInnes 
3b9147fbbSdalcinl #include "include/private/snesimpl.h"       /*I   "petscsnes.h"   I*/
4e7e93795SLois Curfman McInnes 
54a2ae208SSatish Balay #undef __FUNCT__
6a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorSolution"
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
173f1db9ecSBarry Smith -  dummy - either a viewer or PETSC_NULL
183f1db9ecSBarry Smith 
1936851e7fSLois Curfman McInnes    Level: intermediate
203f1db9ecSBarry Smith 
2136851e7fSLois Curfman McInnes .keywords: SNES, nonlinear, vector, monitor, view
223f1db9ecSBarry Smith 
23a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView()
243f1db9ecSBarry Smith @*/
25a6570f20SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorSolution(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy)
263f1db9ecSBarry Smith {
27dfbe8321SBarry Smith   PetscErrorCode ierr;
283f1db9ecSBarry Smith   Vec            x;
29b0a32e0cSBarry Smith   PetscViewer    viewer = (PetscViewer) dummy;
303f1db9ecSBarry Smith 
313f1db9ecSBarry Smith   PetscFunctionBegin;
323f1db9ecSBarry Smith   ierr = SNESGetSolution(snes,&x);CHKERRQ(ierr);
333f1db9ecSBarry Smith   if (!viewer) {
343f1db9ecSBarry Smith     MPI_Comm comm;
353f1db9ecSBarry Smith     ierr   = PetscObjectGetComm((PetscObject)snes,&comm);CHKERRQ(ierr);
36b0a32e0cSBarry Smith     viewer = PETSC_VIEWER_DRAW_(comm);
373f1db9ecSBarry Smith   }
383f1db9ecSBarry Smith   ierr = VecView(x,viewer);CHKERRQ(ierr);
393f1db9ecSBarry Smith 
403f1db9ecSBarry Smith   PetscFunctionReturn(0);
413f1db9ecSBarry Smith }
423f1db9ecSBarry Smith 
434a2ae208SSatish Balay #undef __FUNCT__
44a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorResidual"
455ed2d596SBarry Smith /*@C
46a6570f20SBarry Smith    SNESMonitorResidual - Monitors progress of the SNES solvers by calling
475ed2d596SBarry Smith    VecView() for the residual at each iteration.
485ed2d596SBarry Smith 
495ed2d596SBarry Smith    Collective on SNES
505ed2d596SBarry Smith 
515ed2d596SBarry Smith    Input Parameters:
525ed2d596SBarry Smith +  snes - the SNES context
535ed2d596SBarry Smith .  its - iteration number
544b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
555ed2d596SBarry Smith -  dummy - either a viewer or PETSC_NULL
565ed2d596SBarry Smith 
575ed2d596SBarry Smith    Level: intermediate
585ed2d596SBarry Smith 
595ed2d596SBarry Smith .keywords: SNES, nonlinear, vector, monitor, view
605ed2d596SBarry Smith 
61a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView()
625ed2d596SBarry Smith @*/
63a6570f20SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorResidual(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy)
645ed2d596SBarry Smith {
65dfbe8321SBarry Smith   PetscErrorCode ierr;
665ed2d596SBarry Smith   Vec            x;
675ed2d596SBarry Smith   PetscViewer    viewer = (PetscViewer) dummy;
685ed2d596SBarry Smith 
695ed2d596SBarry Smith   PetscFunctionBegin;
705ed2d596SBarry Smith   ierr = SNESGetFunction(snes,&x,0,0);CHKERRQ(ierr);
715ed2d596SBarry Smith   if (!viewer) {
725ed2d596SBarry Smith     MPI_Comm comm;
735ed2d596SBarry Smith     ierr   = PetscObjectGetComm((PetscObject)snes,&comm);CHKERRQ(ierr);
745ed2d596SBarry Smith     viewer = PETSC_VIEWER_DRAW_(comm);
755ed2d596SBarry Smith   }
765ed2d596SBarry Smith   ierr = VecView(x,viewer);CHKERRQ(ierr);
775ed2d596SBarry Smith 
785ed2d596SBarry Smith   PetscFunctionReturn(0);
795ed2d596SBarry Smith }
805ed2d596SBarry Smith 
815ed2d596SBarry Smith #undef __FUNCT__
82a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorSolutionUpdate"
83d132466eSBarry Smith /*@C
84a6570f20SBarry Smith    SNESMonitorSolutionUpdate - Monitors progress of the SNES solvers by calling
85d132466eSBarry Smith    VecView() for the UPDATE to the solution at each iteration.
86d132466eSBarry Smith 
87d132466eSBarry Smith    Collective on SNES
88d132466eSBarry Smith 
89d132466eSBarry Smith    Input Parameters:
90d132466eSBarry Smith +  snes - the SNES context
91d132466eSBarry Smith .  its - iteration number
924b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
93d132466eSBarry Smith -  dummy - either a viewer or PETSC_NULL
94d132466eSBarry Smith 
95d132466eSBarry Smith    Level: intermediate
96d132466eSBarry Smith 
97d132466eSBarry Smith .keywords: SNES, nonlinear, vector, monitor, view
98d132466eSBarry Smith 
99a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView()
100d132466eSBarry Smith @*/
101a6570f20SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorSolutionUpdate(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy)
102d132466eSBarry Smith {
103dfbe8321SBarry Smith   PetscErrorCode ierr;
104d132466eSBarry Smith   Vec            x;
105b0a32e0cSBarry Smith   PetscViewer    viewer = (PetscViewer) dummy;
106d132466eSBarry Smith 
107d132466eSBarry Smith   PetscFunctionBegin;
108d132466eSBarry Smith   ierr = SNESGetSolutionUpdate(snes,&x);CHKERRQ(ierr);
109d132466eSBarry Smith   if (!viewer) {
110d132466eSBarry Smith     MPI_Comm comm;
111d132466eSBarry Smith     ierr   = PetscObjectGetComm((PetscObject)snes,&comm);CHKERRQ(ierr);
112b0a32e0cSBarry Smith     viewer = PETSC_VIEWER_DRAW_(comm);
113d132466eSBarry Smith   }
114d132466eSBarry Smith   ierr = VecView(x,viewer);CHKERRQ(ierr);
115d132466eSBarry Smith 
116d132466eSBarry Smith   PetscFunctionReturn(0);
117d132466eSBarry Smith }
118d132466eSBarry Smith 
1194a2ae208SSatish Balay #undef __FUNCT__
120a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorDefault"
1214b828684SBarry Smith /*@C
122a6570f20SBarry Smith    SNESMonitorDefault - Monitors progress of the SNES solvers (default).
123e7e93795SLois Curfman McInnes 
124c7afd0dbSLois Curfman McInnes    Collective on SNES
125c7afd0dbSLois Curfman McInnes 
126e7e93795SLois Curfman McInnes    Input Parameters:
127c7afd0dbSLois Curfman McInnes +  snes - the SNES context
128e7e93795SLois Curfman McInnes .  its - iteration number
1294b27c08aSLois Curfman McInnes .  fgnorm - 2-norm of residual
130c7afd0dbSLois Curfman McInnes -  dummy - unused context
131fee21e36SBarry Smith 
132e7e93795SLois Curfman McInnes    Notes:
1334b27c08aSLois Curfman McInnes    This routine prints the residual norm at each iteration.
134e7e93795SLois Curfman McInnes 
13536851e7fSLois Curfman McInnes    Level: intermediate
13636851e7fSLois Curfman McInnes 
137e7e93795SLois Curfman McInnes .keywords: SNES, nonlinear, default, monitor, norm
138e7e93795SLois Curfman McInnes 
139a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution()
140e7e93795SLois Curfman McInnes @*/
141a6570f20SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorDefault(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy)
142e7e93795SLois Curfman McInnes {
143dfbe8321SBarry Smith   PetscErrorCode          ierr;
144a34d58ebSBarry Smith   PetscViewerASCIIMonitor viewer = (PetscViewerASCIIMonitor) dummy;
145d132466eSBarry Smith 
1463a40ed3dSBarry Smith   PetscFunctionBegin;
147a34d58ebSBarry Smith   if (!dummy) {
1487adad957SLisandro Dalcin     ierr = PetscViewerASCIIMonitorCreate(((PetscObject)snes)->comm,"stdout",0,&viewer);CHKERRQ(ierr);
149a34d58ebSBarry Smith   }
150a34d58ebSBarry Smith   ierr = PetscViewerASCIIMonitorPrintf(viewer,"%3D SNES Function norm %14.12e \n",its,fgnorm);CHKERRQ(ierr);
151a34d58ebSBarry Smith   if (!dummy) {
152a34d58ebSBarry Smith     ierr = PetscViewerASCIIMonitorDestroy(viewer);CHKERRQ(ierr);
153a34d58ebSBarry Smith   }
1543a40ed3dSBarry Smith   PetscFunctionReturn(0);
155e7e93795SLois Curfman McInnes }
1563f1db9ecSBarry Smith 
157*b271bb04SBarry Smith #undef __FUNCT__
158*b271bb04SBarry Smith #define __FUNCT__ "SNESMonitorRange_Private"
159*b271bb04SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorRange_Private(SNES snes,PetscInt it,PetscReal *per)
160*b271bb04SBarry Smith {
161*b271bb04SBarry Smith   PetscErrorCode          ierr;
162*b271bb04SBarry Smith   Vec                     resid;
163*b271bb04SBarry Smith   PetscReal               rmax,pwork;
164*b271bb04SBarry Smith   PetscInt                i,n,N;
165*b271bb04SBarry Smith   PetscScalar             *r;
166*b271bb04SBarry Smith 
167*b271bb04SBarry Smith   PetscFunctionBegin;
168*b271bb04SBarry Smith   ierr = SNESGetFunction(snes,&resid,0,0);CHKERRQ(ierr);
169*b271bb04SBarry Smith   ierr = VecNorm(resid,NORM_INFINITY,&rmax);CHKERRQ(ierr);
170*b271bb04SBarry Smith   ierr = VecGetLocalSize(resid,&n);CHKERRQ(ierr);
171*b271bb04SBarry Smith   ierr = VecGetSize(resid,&N);CHKERRQ(ierr);
172*b271bb04SBarry Smith   ierr = VecGetArray(resid,&r);CHKERRQ(ierr);
173*b271bb04SBarry Smith   pwork = 0.0;
174*b271bb04SBarry Smith   for (i=0; i<n; i++) {
175*b271bb04SBarry Smith     pwork += (PetscAbsScalar(r[i]) > .20*rmax);
176*b271bb04SBarry Smith   }
177*b271bb04SBarry Smith   ierr = MPI_Allreduce(&pwork,per,1,MPIU_REAL,PetscSum_Op,((PetscObject)snes)->comm);CHKERRQ(ierr);
178*b271bb04SBarry Smith   ierr = VecRestoreArray(resid,&r);CHKERRQ(ierr);
179*b271bb04SBarry Smith   *per  = *per/N;
180*b271bb04SBarry Smith   PetscFunctionReturn(0);
181*b271bb04SBarry Smith }
182*b271bb04SBarry Smith 
183*b271bb04SBarry Smith #undef __FUNCT__
184*b271bb04SBarry Smith #define __FUNCT__ "SNESMonitorRange"
185*b271bb04SBarry Smith /*@C
186*b271bb04SBarry Smith    SNESMonitorRange - Prints the percentage of residual elements that are more then 10 percent of the maximum value.
187*b271bb04SBarry Smith 
188*b271bb04SBarry Smith    Collective on SNES
189*b271bb04SBarry Smith 
190*b271bb04SBarry Smith    Input Parameters:
191*b271bb04SBarry Smith +  snes   - iterative context
192*b271bb04SBarry Smith .  it    - iteration number
193*b271bb04SBarry Smith .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
194*b271bb04SBarry Smith -  dummy - unused monitor context
195*b271bb04SBarry Smith 
196*b271bb04SBarry Smith    Options Database Key:
197*b271bb04SBarry Smith .  -snes_monitor_range - Activates SNESMonitorRange()
198*b271bb04SBarry Smith 
199*b271bb04SBarry Smith 
200*b271bb04SBarry Smith    Notes:
201*b271bb04SBarry Smith    When using either ICC or ILU preconditioners in BlockSolve95
202*b271bb04SBarry Smith    (via MATMPIROWBS matrix format), then use this monitor will
203*b271bb04SBarry Smith    print both the residual norm associated with the original
204*b271bb04SBarry Smith    (unscaled) matrix.
205*b271bb04SBarry Smith 
206*b271bb04SBarry Smith    Level: intermediate
207*b271bb04SBarry Smith 
208*b271bb04SBarry Smith .keywords: SNES, default, monitor, residual
209*b271bb04SBarry Smith 
210*b271bb04SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), SNESMonitorLGCreate()
211*b271bb04SBarry Smith @*/
212*b271bb04SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorRange(SNES snes,PetscInt it,PetscReal rnorm,void *dummy)
213*b271bb04SBarry Smith {
214*b271bb04SBarry Smith   PetscErrorCode          ierr;
215*b271bb04SBarry Smith   PetscReal               perc,rel;
216*b271bb04SBarry Smith   PetscViewerASCIIMonitor viewer = (PetscViewerASCIIMonitor) dummy;
217*b271bb04SBarry Smith   /* should be in a MonitorRangeContext */
218*b271bb04SBarry Smith   static PetscReal        prev;
219*b271bb04SBarry Smith 
220*b271bb04SBarry Smith   PetscFunctionBegin;
221*b271bb04SBarry Smith   if (!it) prev = rnorm;
222*b271bb04SBarry Smith   if (!dummy) {ierr = PetscViewerASCIIMonitorCreate(((PetscObject)snes)->comm,"stdout",0,&viewer);CHKERRQ(ierr);}
223*b271bb04SBarry Smith   ierr = SNESMonitorRange_Private(snes,it,&perc);CHKERRQ(ierr);
224*b271bb04SBarry Smith 
225*b271bb04SBarry Smith   rel  = (prev - rnorm)/prev;
226*b271bb04SBarry Smith   prev = rnorm;
227*b271bb04SBarry Smith   ierr = PetscViewerASCIIMonitorPrintf(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,rnorm,100.0*perc,rel,rel/perc);CHKERRQ(ierr);
228*b271bb04SBarry Smith   if (!dummy) {ierr = PetscViewerASCIIMonitorDestroy(viewer);CHKERRQ(ierr);}
229*b271bb04SBarry Smith   PetscFunctionReturn(0);
230*b271bb04SBarry Smith }
231*b271bb04SBarry Smith 
232eabae89aSBarry Smith typedef struct {
233a34d58ebSBarry Smith   PetscViewerASCIIMonitor viewer;
234eabae89aSBarry Smith   PetscReal               *history;
235a6570f20SBarry Smith } SNESMonitorRatioContext;
236eabae89aSBarry Smith 
2373a7fca6bSBarry Smith #undef __FUNCT__
238a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorRatio"
2393a7fca6bSBarry Smith /*@C
240a6570f20SBarry Smith    SNESMonitorRatio - Monitors progress of the SNES solvers by printing the ratio
2414b27c08aSLois Curfman McInnes    of residual norm at each iteration to the previous.
2423a7fca6bSBarry Smith 
2433a7fca6bSBarry Smith    Collective on SNES
2443a7fca6bSBarry Smith 
2453a7fca6bSBarry Smith    Input Parameters:
2463a7fca6bSBarry Smith +  snes - the SNES context
2473a7fca6bSBarry Smith .  its - iteration number
2483a7fca6bSBarry Smith .  fgnorm - 2-norm of residual (or gradient)
249eabae89aSBarry Smith -  dummy -  context of monitor
2503a7fca6bSBarry Smith 
2513a7fca6bSBarry Smith    Level: intermediate
2523a7fca6bSBarry Smith 
2533a7fca6bSBarry Smith .keywords: SNES, nonlinear, monitor, norm
2543a7fca6bSBarry Smith 
255a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution()
2563a7fca6bSBarry Smith @*/
257a6570f20SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorRatio(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy)
2583a7fca6bSBarry Smith {
259dfbe8321SBarry Smith   PetscErrorCode          ierr;
26077431f27SBarry Smith   PetscInt                len;
26187828ca2SBarry Smith   PetscReal               *history;
262a6570f20SBarry Smith   SNESMonitorRatioContext *ctx = (SNESMonitorRatioContext*)dummy;
2633a7fca6bSBarry Smith 
2643a7fca6bSBarry Smith   PetscFunctionBegin;
2653a7fca6bSBarry Smith   ierr = SNESGetConvergenceHistory(snes,&history,PETSC_NULL,&len);CHKERRQ(ierr);
266958c9bccSBarry Smith   if (!its || !history || its > len) {
267a34d58ebSBarry Smith     ierr = PetscViewerASCIIMonitorPrintf(ctx->viewer,"%3D SNES Function norm %14.12e \n",its,fgnorm);CHKERRQ(ierr);
2683a7fca6bSBarry Smith   } else {
26987828ca2SBarry Smith     PetscReal ratio = fgnorm/history[its-1];
270a34d58ebSBarry Smith     ierr = PetscViewerASCIIMonitorPrintf(ctx->viewer,"%3D SNES Function norm %14.12e %G \n",its,fgnorm,ratio);CHKERRQ(ierr);
2713a7fca6bSBarry Smith   }
2723a7fca6bSBarry Smith   PetscFunctionReturn(0);
2733a7fca6bSBarry Smith }
2743a7fca6bSBarry Smith 
2753a7fca6bSBarry Smith /*
2763a7fca6bSBarry Smith    If the we set the history monitor space then we must destroy it
2773a7fca6bSBarry Smith */
2783a7fca6bSBarry Smith #undef __FUNCT__
279a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorRatioDestroy"
280a6570f20SBarry Smith PetscErrorCode SNESMonitorRatioDestroy(void *ct)
2813a7fca6bSBarry Smith {
282dfbe8321SBarry Smith   PetscErrorCode          ierr;
283a6570f20SBarry Smith   SNESMonitorRatioContext *ctx = (SNESMonitorRatioContext*)ct;
2843a7fca6bSBarry Smith 
2853a7fca6bSBarry Smith   PetscFunctionBegin;
28605b42c5fSBarry Smith   ierr = PetscFree(ctx->history);CHKERRQ(ierr);
287a34d58ebSBarry Smith   ierr = PetscViewerASCIIMonitorDestroy(ctx->viewer);CHKERRQ(ierr);
288eabae89aSBarry Smith   ierr = PetscFree(ctx);CHKERRQ(ierr);
2893a7fca6bSBarry Smith   PetscFunctionReturn(0);
2903a7fca6bSBarry Smith }
2913a7fca6bSBarry Smith 
2923a7fca6bSBarry Smith #undef __FUNCT__
293a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorSetRatio"
2943a7fca6bSBarry Smith /*@C
295a6570f20SBarry Smith    SNESMonitorSetRatio - Sets SNES to use a monitor that prints the
2964b27c08aSLois Curfman McInnes    ratio of the function norm at each iteration.
2973a7fca6bSBarry Smith 
2983a7fca6bSBarry Smith    Collective on SNES
2993a7fca6bSBarry Smith 
3003a7fca6bSBarry Smith    Input Parameters:
301eabae89aSBarry Smith +   snes - the SNES context
302eabae89aSBarry Smith -   viewer - ASCII viewer to print output
3033a7fca6bSBarry Smith 
3043a7fca6bSBarry Smith    Level: intermediate
3053a7fca6bSBarry Smith 
3063a7fca6bSBarry Smith .keywords: SNES, nonlinear, monitor, norm
3073a7fca6bSBarry Smith 
308a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault()
3093a7fca6bSBarry Smith @*/
310a34d58ebSBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorSetRatio(SNES snes,PetscViewerASCIIMonitor viewer)
3113a7fca6bSBarry Smith {
312dfbe8321SBarry Smith   PetscErrorCode          ierr;
313a6570f20SBarry Smith   SNESMonitorRatioContext *ctx;
31487828ca2SBarry Smith   PetscReal               *history;
3153a7fca6bSBarry Smith 
3163a7fca6bSBarry Smith   PetscFunctionBegin;
317eabae89aSBarry Smith   if (!viewer) {
3187adad957SLisandro Dalcin     ierr = PetscViewerASCIIMonitorCreate(((PetscObject)snes)->comm,"stdout",0,&viewer);CHKERRQ(ierr);
319eabae89aSBarry Smith     ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr);
320eabae89aSBarry Smith   }
32138f2d2fdSLisandro Dalcin   ierr = PetscNewLog(snes,SNESMonitorRatioContext,&ctx);
3223a7fca6bSBarry Smith   ierr = SNESGetConvergenceHistory(snes,&history,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
3233a7fca6bSBarry Smith   if (!history) {
324eabae89aSBarry Smith     ierr = PetscMalloc(100*sizeof(PetscReal),&ctx->history);CHKERRQ(ierr);
325eabae89aSBarry Smith     ierr = SNESSetConvergenceHistory(snes,ctx->history,0,100,PETSC_TRUE);CHKERRQ(ierr);
3263a7fca6bSBarry Smith   }
327eabae89aSBarry Smith   ctx->viewer = viewer;
328a6570f20SBarry Smith   ierr = SNESMonitorSet(snes,SNESMonitorRatio,ctx,SNESMonitorRatioDestroy);CHKERRQ(ierr);
3293a7fca6bSBarry Smith   PetscFunctionReturn(0);
3303a7fca6bSBarry Smith }
3313a7fca6bSBarry Smith 
332e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */
3334a2ae208SSatish Balay #undef __FUNCT__
334a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorDefaultShort"
335be1f7002SBarry Smith /*
336a6570f20SBarry Smith      Default (short) SNES Monitor, same as SNESMonitorDefault() except
337be1f7002SBarry Smith   it prints fewer digits of the residual as the residual gets smaller.
338be1f7002SBarry Smith   This is because the later digits are meaningless and are often
339be1f7002SBarry Smith   different on different machines; by using this routine different
340be1f7002SBarry Smith   machines will usually generate the same output.
341be1f7002SBarry Smith */
342a6570f20SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorDefaultShort(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy)
343e7e93795SLois Curfman McInnes {
344dfbe8321SBarry Smith   PetscErrorCode          ierr;
345a34d58ebSBarry Smith   PetscViewerASCIIMonitor viewer = (PetscViewerASCIIMonitor) dummy;
346d132466eSBarry Smith 
3473a40ed3dSBarry Smith   PetscFunctionBegin;
348a34d58ebSBarry Smith   if (!dummy) {
3497adad957SLisandro Dalcin     ierr = PetscViewerASCIIMonitorCreate(((PetscObject)snes)->comm,"stdout",0,&viewer);CHKERRQ(ierr);
350a34d58ebSBarry Smith   }
3518f240d10SBarry Smith   if (fgnorm > 1.e-9) {
352a34d58ebSBarry Smith     ierr = PetscViewerASCIIMonitorPrintf(viewer,"%3D SNES Function norm %G \n",its,fgnorm);CHKERRQ(ierr);
3533a40ed3dSBarry Smith   } else if (fgnorm > 1.e-11){
354a34d58ebSBarry Smith     ierr = PetscViewerASCIIMonitorPrintf(viewer,"%3D SNES Function norm %5.3e \n",its,fgnorm);CHKERRQ(ierr);
3553a40ed3dSBarry Smith   } else {
356a34d58ebSBarry Smith     ierr = PetscViewerASCIIMonitorPrintf(viewer,"%3D SNES Function norm < 1.e-11\n",its);CHKERRQ(ierr);
357a34d58ebSBarry Smith   }
358a34d58ebSBarry Smith   if (!dummy) {
359a34d58ebSBarry Smith     ierr = PetscViewerASCIIMonitorDestroy(viewer);CHKERRQ(ierr);
360e7e93795SLois Curfman McInnes   }
3613a40ed3dSBarry Smith   PetscFunctionReturn(0);
362e7e93795SLois Curfman McInnes }
363e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */
3644a2ae208SSatish Balay #undef __FUNCT__
3653f149594SLisandro Dalcin #define __FUNCT__ "SNESDefaultConverged"
3664b828684SBarry Smith /*@C
3673f149594SLisandro Dalcin    SNESDefaultConverged - Convergence test of the solvers for
368f525115eSLois Curfman McInnes    systems of nonlinear equations (default).
369e7e93795SLois Curfman McInnes 
370c7afd0dbSLois Curfman McInnes    Collective on SNES
371c7afd0dbSLois Curfman McInnes 
372e7e93795SLois Curfman McInnes    Input Parameters:
373c7afd0dbSLois Curfman McInnes +  snes - the SNES context
37406ee9f85SBarry Smith .  it - the iteration (0 indicates before any Newton steps)
375e7e93795SLois Curfman McInnes .  xnorm - 2-norm of current iterate
376e7e93795SLois Curfman McInnes .  pnorm - 2-norm of current step
3777f3332b4SBarry Smith .  fnorm - 2-norm of function at current iterate
378c7afd0dbSLois Curfman McInnes -  dummy - unused context
379e7e93795SLois Curfman McInnes 
380184914b5SBarry Smith    Output Parameter:
381184914b5SBarry Smith .   reason  - one of
38270441072SBarry Smith $  SNES_CONVERGED_FNORM_ABS       - (fnorm < abstol),
3833304466cSBarry Smith $  SNES_CONVERGED_PNORM_RELATIVE  - (pnorm < xtol*xnorm),
384184914b5SBarry Smith $  SNES_CONVERGED_FNORM_RELATIVE  - (fnorm < rtol*fnorm0),
385184914b5SBarry Smith $  SNES_DIVERGED_FUNCTION_COUNT   - (nfct > maxf),
386184914b5SBarry Smith $  SNES_DIVERGED_FNORM_NAN        - (fnorm == NaN),
387184914b5SBarry Smith $  SNES_CONVERGED_ITERATING       - (otherwise),
388e7e93795SLois Curfman McInnes 
389e7e93795SLois Curfman McInnes    where
390c7afd0dbSLois Curfman McInnes +    maxf - maximum number of function evaluations,
391c7afd0dbSLois Curfman McInnes             set with SNESSetTolerances()
392c7afd0dbSLois Curfman McInnes .    nfct - number of function evaluations,
39370441072SBarry Smith .    abstol - absolute function norm tolerance,
394c7afd0dbSLois Curfman McInnes             set with SNESSetTolerances()
395c7afd0dbSLois Curfman McInnes -    rtol - relative function norm tolerance, set with SNESSetTolerances()
396fee21e36SBarry Smith 
39736851e7fSLois Curfman McInnes    Level: intermediate
39836851e7fSLois Curfman McInnes 
399e7e93795SLois Curfman McInnes .keywords: SNES, nonlinear, default, converged, convergence
400e7e93795SLois Curfman McInnes 
40171f87433Sdalcinl .seealso: SNESSetConvergenceTest()
402e7e93795SLois Curfman McInnes @*/
4033f149594SLisandro Dalcin PetscErrorCode PETSCSNES_DLLEXPORT SNESDefaultConverged(SNES snes,PetscInt it,PetscReal xnorm,PetscReal pnorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy)
404e7e93795SLois Curfman McInnes {
40563ba0a88SBarry Smith   PetscErrorCode ierr;
40663ba0a88SBarry Smith 
4073a40ed3dSBarry Smith   PetscFunctionBegin;
4083f149594SLisandro Dalcin   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
4093f149594SLisandro Dalcin   PetscValidPointer(reason,6);
4103f149594SLisandro Dalcin 
41106ee9f85SBarry Smith   *reason = SNES_CONVERGED_ITERATING;
41206ee9f85SBarry Smith 
41306ee9f85SBarry Smith   if (!it) {
41406ee9f85SBarry Smith     /* set parameter for default relative tolerance convergence test */
41506ee9f85SBarry Smith     snes->ttol = fnorm*snes->rtol;
41606ee9f85SBarry Smith   }
417d252947aSBarry Smith   if (fnorm != fnorm) {
418ae15b995SBarry Smith     ierr = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr);
419184914b5SBarry Smith     *reason = SNES_DIVERGED_FNORM_NAN;
42070441072SBarry Smith   } else if (fnorm < snes->abstol) {
421ae15b995SBarry Smith     ierr = PetscInfo2(snes,"Converged due to function norm %G < %G\n",fnorm,snes->abstol);CHKERRQ(ierr);
422184914b5SBarry Smith     *reason = SNES_CONVERGED_FNORM_ABS;
42343e71028SBarry Smith   } else if (snes->nfuncs >= snes->max_funcs) {
424ae15b995SBarry Smith     ierr = PetscInfo2(snes,"Exceeded maximum number of function evaluations: %D > %D\n",snes->nfuncs,snes->max_funcs);CHKERRQ(ierr);
425184914b5SBarry Smith     *reason = SNES_DIVERGED_FUNCTION_COUNT;
42606ee9f85SBarry Smith   }
42706ee9f85SBarry Smith 
42806ee9f85SBarry Smith   if (it && !*reason) {
42906ee9f85SBarry Smith     if (fnorm <= snes->ttol) {
43006ee9f85SBarry Smith       ierr = PetscInfo2(snes,"Converged due to function norm %G < %G (relative tolerance)\n",fnorm,snes->ttol);CHKERRQ(ierr);
43106ee9f85SBarry Smith       *reason = SNES_CONVERGED_FNORM_RELATIVE;
43206ee9f85SBarry Smith     } else if (pnorm < snes->xtol*xnorm) {
43306ee9f85SBarry Smith       ierr = PetscInfo3(snes,"Converged due to small update length: %G < %G * %G\n",pnorm,snes->xtol,xnorm);CHKERRQ(ierr);
43406ee9f85SBarry Smith       *reason = SNES_CONVERGED_PNORM_RELATIVE;
43506ee9f85SBarry Smith     }
436e7e93795SLois Curfman McInnes   }
4373a40ed3dSBarry Smith   PetscFunctionReturn(0);
438e7e93795SLois Curfman McInnes }
4393f149594SLisandro Dalcin 
4403f149594SLisandro Dalcin #undef __FUNCT__
4413f149594SLisandro Dalcin #define __FUNCT__ "SNESSkipConverged"
4423f149594SLisandro Dalcin /*@C
4433f149594SLisandro Dalcin    SNESSkipConverged - Convergence test for SNES that NEVER returns as
4443f149594SLisandro Dalcin    converged, UNLESS the maximum number of iteration have been reached.
4453f149594SLisandro Dalcin 
4463f149594SLisandro Dalcin    Collective on SNES
4473f149594SLisandro Dalcin 
4483f149594SLisandro Dalcin    Input Parameters:
4493f149594SLisandro Dalcin +  snes - the SNES context
4503f149594SLisandro Dalcin .  it - the iteration (0 indicates before any Newton steps)
4513f149594SLisandro Dalcin .  xnorm - 2-norm of current iterate
4523f149594SLisandro Dalcin .  pnorm - 2-norm of current step
4533f149594SLisandro Dalcin .  fnorm - 2-norm of function at current iterate
4543f149594SLisandro Dalcin -  dummy - unused context
4553f149594SLisandro Dalcin 
4563f149594SLisandro Dalcin    Output Parameter:
45785385478SLisandro Dalcin .   reason  - SNES_CONVERGED_ITERATING, SNES_CONVERGED_ITS, or SNES_DIVERGED_FNORM_NAN
4583f149594SLisandro Dalcin 
4593f149594SLisandro Dalcin    Notes:
4603f149594SLisandro Dalcin    Convergence is then declared after a fixed number of iterations have been used.
4613f149594SLisandro Dalcin 
4623f149594SLisandro Dalcin    Level: advanced
4633f149594SLisandro Dalcin 
4643f149594SLisandro Dalcin .keywords: SNES, nonlinear, skip, converged, convergence
4653f149594SLisandro Dalcin 
4663f149594SLisandro Dalcin .seealso: SNESSetConvergenceTest()
4673f149594SLisandro Dalcin @*/
4683f149594SLisandro Dalcin PetscErrorCode PETSCSNES_DLLEXPORT SNESSkipConverged(SNES snes,PetscInt it,PetscReal xnorm,PetscReal pnorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy)
4693f149594SLisandro Dalcin {
4703f149594SLisandro Dalcin   PetscErrorCode ierr;
4713f149594SLisandro Dalcin 
4723f149594SLisandro Dalcin   PetscFunctionBegin;
4733f149594SLisandro Dalcin   PetscValidHeaderSpecific(snes,SNES_COOKIE,1);
4743f149594SLisandro Dalcin   PetscValidPointer(reason,6);
4753f149594SLisandro Dalcin 
4763f149594SLisandro Dalcin   *reason = SNES_CONVERGED_ITERATING;
4773f149594SLisandro Dalcin 
4783f149594SLisandro Dalcin   if (fnorm != fnorm) {
4793f149594SLisandro Dalcin     ierr = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr);
4803f149594SLisandro Dalcin     *reason = SNES_DIVERGED_FNORM_NAN;
4813f149594SLisandro Dalcin   } else if(it == snes->max_its) {
4823f149594SLisandro Dalcin     *reason = SNES_CONVERGED_ITS;
4833f149594SLisandro Dalcin   }
4843f149594SLisandro Dalcin   PetscFunctionReturn(0);
4853f149594SLisandro Dalcin }
4863f149594SLisandro Dalcin 
487