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