163dd3a1aSKris Buschelman #define PETSCSNES_DLL 2e7e93795SLois Curfman McInnes 37c4f633dSBarry Smith #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 157b271bb04SBarry Smith #undef __FUNCT__ 158b271bb04SBarry Smith #define __FUNCT__ "SNESMonitorRange_Private" 159b271bb04SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorRange_Private(SNES snes,PetscInt it,PetscReal *per) 160b271bb04SBarry Smith { 161b271bb04SBarry Smith PetscErrorCode ierr; 162b271bb04SBarry Smith Vec resid; 163b271bb04SBarry Smith PetscReal rmax,pwork; 164b271bb04SBarry Smith PetscInt i,n,N; 165b271bb04SBarry Smith PetscScalar *r; 166b271bb04SBarry Smith 167b271bb04SBarry Smith PetscFunctionBegin; 168b271bb04SBarry Smith ierr = SNESGetFunction(snes,&resid,0,0);CHKERRQ(ierr); 169b271bb04SBarry Smith ierr = VecNorm(resid,NORM_INFINITY,&rmax);CHKERRQ(ierr); 170b271bb04SBarry Smith ierr = VecGetLocalSize(resid,&n);CHKERRQ(ierr); 171b271bb04SBarry Smith ierr = VecGetSize(resid,&N);CHKERRQ(ierr); 172b271bb04SBarry Smith ierr = VecGetArray(resid,&r);CHKERRQ(ierr); 173b271bb04SBarry Smith pwork = 0.0; 174b271bb04SBarry Smith for (i=0; i<n; i++) { 175b271bb04SBarry Smith pwork += (PetscAbsScalar(r[i]) > .20*rmax); 176b271bb04SBarry Smith } 17706a205a8SBarry Smith ierr = MPI_Allreduce(&pwork,per,1,MPIU_REAL,MPIU_SUM,((PetscObject)snes)->comm);CHKERRQ(ierr); 178b271bb04SBarry Smith ierr = VecRestoreArray(resid,&r);CHKERRQ(ierr); 179b271bb04SBarry Smith *per = *per/N; 180b271bb04SBarry Smith PetscFunctionReturn(0); 181b271bb04SBarry Smith } 182b271bb04SBarry Smith 183b271bb04SBarry Smith #undef __FUNCT__ 184b271bb04SBarry Smith #define __FUNCT__ "SNESMonitorRange" 185b271bb04SBarry Smith /*@C 186b271bb04SBarry Smith SNESMonitorRange - Prints the percentage of residual elements that are more then 10 percent of the maximum value. 187b271bb04SBarry Smith 188b271bb04SBarry Smith Collective on SNES 189b271bb04SBarry Smith 190b271bb04SBarry Smith Input Parameters: 191b271bb04SBarry Smith + snes - iterative context 192b271bb04SBarry Smith . it - iteration number 193b271bb04SBarry Smith . rnorm - 2-norm (preconditioned) residual value (may be estimated). 194b271bb04SBarry Smith - dummy - unused monitor context 195b271bb04SBarry Smith 196b271bb04SBarry Smith Options Database Key: 197b271bb04SBarry Smith . -snes_monitor_range - Activates SNESMonitorRange() 198b271bb04SBarry Smith 199b271bb04SBarry Smith Level: intermediate 200b271bb04SBarry Smith 201b271bb04SBarry Smith .keywords: SNES, default, monitor, residual 202b271bb04SBarry Smith 203b271bb04SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), SNESMonitorLGCreate() 204b271bb04SBarry Smith @*/ 205b271bb04SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorRange(SNES snes,PetscInt it,PetscReal rnorm,void *dummy) 206b271bb04SBarry Smith { 207b271bb04SBarry Smith PetscErrorCode ierr; 208b271bb04SBarry Smith PetscReal perc,rel; 209b271bb04SBarry Smith PetscViewerASCIIMonitor viewer = (PetscViewerASCIIMonitor) dummy; 210b271bb04SBarry Smith /* should be in a MonitorRangeContext */ 211b271bb04SBarry Smith static PetscReal prev; 212b271bb04SBarry Smith 213b271bb04SBarry Smith PetscFunctionBegin; 214b271bb04SBarry Smith if (!it) prev = rnorm; 215b271bb04SBarry Smith if (!dummy) {ierr = PetscViewerASCIIMonitorCreate(((PetscObject)snes)->comm,"stdout",0,&viewer);CHKERRQ(ierr);} 216b271bb04SBarry Smith ierr = SNESMonitorRange_Private(snes,it,&perc);CHKERRQ(ierr); 217b271bb04SBarry Smith 218b271bb04SBarry Smith rel = (prev - rnorm)/prev; 219b271bb04SBarry Smith prev = rnorm; 220b271bb04SBarry 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); 221b271bb04SBarry Smith if (!dummy) {ierr = PetscViewerASCIIMonitorDestroy(viewer);CHKERRQ(ierr);} 222b271bb04SBarry Smith PetscFunctionReturn(0); 223b271bb04SBarry Smith } 224b271bb04SBarry Smith 225eabae89aSBarry Smith typedef struct { 226a34d58ebSBarry Smith PetscViewerASCIIMonitor viewer; 227eabae89aSBarry Smith PetscReal *history; 228a6570f20SBarry Smith } SNESMonitorRatioContext; 229eabae89aSBarry Smith 2303a7fca6bSBarry Smith #undef __FUNCT__ 231a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorRatio" 2323a7fca6bSBarry Smith /*@C 233a6570f20SBarry Smith SNESMonitorRatio - Monitors progress of the SNES solvers by printing the ratio 2344b27c08aSLois Curfman McInnes of residual norm at each iteration to the previous. 2353a7fca6bSBarry Smith 2363a7fca6bSBarry Smith Collective on SNES 2373a7fca6bSBarry Smith 2383a7fca6bSBarry Smith Input Parameters: 2393a7fca6bSBarry Smith + snes - the SNES context 2403a7fca6bSBarry Smith . its - iteration number 2413a7fca6bSBarry Smith . fgnorm - 2-norm of residual (or gradient) 242eabae89aSBarry Smith - dummy - context of monitor 2433a7fca6bSBarry Smith 2443a7fca6bSBarry Smith Level: intermediate 2453a7fca6bSBarry Smith 2463a7fca6bSBarry Smith .keywords: SNES, nonlinear, monitor, norm 2473a7fca6bSBarry Smith 248a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution() 2493a7fca6bSBarry Smith @*/ 250a6570f20SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorRatio(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy) 2513a7fca6bSBarry Smith { 252dfbe8321SBarry Smith PetscErrorCode ierr; 25377431f27SBarry Smith PetscInt len; 25487828ca2SBarry Smith PetscReal *history; 255a6570f20SBarry Smith SNESMonitorRatioContext *ctx = (SNESMonitorRatioContext*)dummy; 2563a7fca6bSBarry Smith 2573a7fca6bSBarry Smith PetscFunctionBegin; 2583a7fca6bSBarry Smith ierr = SNESGetConvergenceHistory(snes,&history,PETSC_NULL,&len);CHKERRQ(ierr); 259958c9bccSBarry Smith if (!its || !history || its > len) { 260a34d58ebSBarry Smith ierr = PetscViewerASCIIMonitorPrintf(ctx->viewer,"%3D SNES Function norm %14.12e \n",its,fgnorm);CHKERRQ(ierr); 2613a7fca6bSBarry Smith } else { 26287828ca2SBarry Smith PetscReal ratio = fgnorm/history[its-1]; 263a34d58ebSBarry Smith ierr = PetscViewerASCIIMonitorPrintf(ctx->viewer,"%3D SNES Function norm %14.12e %G \n",its,fgnorm,ratio);CHKERRQ(ierr); 2643a7fca6bSBarry Smith } 2653a7fca6bSBarry Smith PetscFunctionReturn(0); 2663a7fca6bSBarry Smith } 2673a7fca6bSBarry Smith 2683a7fca6bSBarry Smith /* 2693a7fca6bSBarry Smith If the we set the history monitor space then we must destroy it 2703a7fca6bSBarry Smith */ 2713a7fca6bSBarry Smith #undef __FUNCT__ 272a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorRatioDestroy" 273a6570f20SBarry Smith PetscErrorCode SNESMonitorRatioDestroy(void *ct) 2743a7fca6bSBarry Smith { 275dfbe8321SBarry Smith PetscErrorCode ierr; 276a6570f20SBarry Smith SNESMonitorRatioContext *ctx = (SNESMonitorRatioContext*)ct; 2773a7fca6bSBarry Smith 2783a7fca6bSBarry Smith PetscFunctionBegin; 27905b42c5fSBarry Smith ierr = PetscFree(ctx->history);CHKERRQ(ierr); 280a34d58ebSBarry Smith ierr = PetscViewerASCIIMonitorDestroy(ctx->viewer);CHKERRQ(ierr); 281eabae89aSBarry Smith ierr = PetscFree(ctx);CHKERRQ(ierr); 2823a7fca6bSBarry Smith PetscFunctionReturn(0); 2833a7fca6bSBarry Smith } 2843a7fca6bSBarry Smith 2853a7fca6bSBarry Smith #undef __FUNCT__ 286a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorSetRatio" 2873a7fca6bSBarry Smith /*@C 288a6570f20SBarry Smith SNESMonitorSetRatio - Sets SNES to use a monitor that prints the 2894b27c08aSLois Curfman McInnes ratio of the function norm at each iteration. 2903a7fca6bSBarry Smith 2913a7fca6bSBarry Smith Collective on SNES 2923a7fca6bSBarry Smith 2933a7fca6bSBarry Smith Input Parameters: 294eabae89aSBarry Smith + snes - the SNES context 295eabae89aSBarry Smith - viewer - ASCII viewer to print output 2963a7fca6bSBarry Smith 2973a7fca6bSBarry Smith Level: intermediate 2983a7fca6bSBarry Smith 2993a7fca6bSBarry Smith .keywords: SNES, nonlinear, monitor, norm 3003a7fca6bSBarry Smith 301a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault() 3023a7fca6bSBarry Smith @*/ 303a34d58ebSBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorSetRatio(SNES snes,PetscViewerASCIIMonitor viewer) 3043a7fca6bSBarry Smith { 305dfbe8321SBarry Smith PetscErrorCode ierr; 306a6570f20SBarry Smith SNESMonitorRatioContext *ctx; 30787828ca2SBarry Smith PetscReal *history; 3083a7fca6bSBarry Smith 3093a7fca6bSBarry Smith PetscFunctionBegin; 310eabae89aSBarry Smith if (!viewer) { 3117adad957SLisandro Dalcin ierr = PetscViewerASCIIMonitorCreate(((PetscObject)snes)->comm,"stdout",0,&viewer);CHKERRQ(ierr); 312eabae89aSBarry Smith ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr); 313eabae89aSBarry Smith } 31438f2d2fdSLisandro Dalcin ierr = PetscNewLog(snes,SNESMonitorRatioContext,&ctx); 3153a7fca6bSBarry Smith ierr = SNESGetConvergenceHistory(snes,&history,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 3163a7fca6bSBarry Smith if (!history) { 317eabae89aSBarry Smith ierr = PetscMalloc(100*sizeof(PetscReal),&ctx->history);CHKERRQ(ierr); 318eabae89aSBarry Smith ierr = SNESSetConvergenceHistory(snes,ctx->history,0,100,PETSC_TRUE);CHKERRQ(ierr); 3193a7fca6bSBarry Smith } 320eabae89aSBarry Smith ctx->viewer = viewer; 321a6570f20SBarry Smith ierr = SNESMonitorSet(snes,SNESMonitorRatio,ctx,SNESMonitorRatioDestroy);CHKERRQ(ierr); 3223a7fca6bSBarry Smith PetscFunctionReturn(0); 3233a7fca6bSBarry Smith } 3243a7fca6bSBarry Smith 325e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */ 3264a2ae208SSatish Balay #undef __FUNCT__ 327a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorDefaultShort" 328be1f7002SBarry Smith /* 329a6570f20SBarry Smith Default (short) SNES Monitor, same as SNESMonitorDefault() except 330be1f7002SBarry Smith it prints fewer digits of the residual as the residual gets smaller. 331be1f7002SBarry Smith This is because the later digits are meaningless and are often 332be1f7002SBarry Smith different on different machines; by using this routine different 333be1f7002SBarry Smith machines will usually generate the same output. 334be1f7002SBarry Smith */ 335a6570f20SBarry Smith PetscErrorCode PETSCSNES_DLLEXPORT SNESMonitorDefaultShort(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy) 336e7e93795SLois Curfman McInnes { 337dfbe8321SBarry Smith PetscErrorCode ierr; 338a34d58ebSBarry Smith PetscViewerASCIIMonitor viewer = (PetscViewerASCIIMonitor) dummy; 339d132466eSBarry Smith 3403a40ed3dSBarry Smith PetscFunctionBegin; 341a34d58ebSBarry Smith if (!dummy) { 3427adad957SLisandro Dalcin ierr = PetscViewerASCIIMonitorCreate(((PetscObject)snes)->comm,"stdout",0,&viewer);CHKERRQ(ierr); 343a34d58ebSBarry Smith } 3448f240d10SBarry Smith if (fgnorm > 1.e-9) { 345a34d58ebSBarry Smith ierr = PetscViewerASCIIMonitorPrintf(viewer,"%3D SNES Function norm %G \n",its,fgnorm);CHKERRQ(ierr); 3463a40ed3dSBarry Smith } else if (fgnorm > 1.e-11){ 347a34d58ebSBarry Smith ierr = PetscViewerASCIIMonitorPrintf(viewer,"%3D SNES Function norm %5.3e \n",its,fgnorm);CHKERRQ(ierr); 3483a40ed3dSBarry Smith } else { 349a34d58ebSBarry Smith ierr = PetscViewerASCIIMonitorPrintf(viewer,"%3D SNES Function norm < 1.e-11\n",its);CHKERRQ(ierr); 350a34d58ebSBarry Smith } 351a34d58ebSBarry Smith if (!dummy) { 352a34d58ebSBarry Smith ierr = PetscViewerASCIIMonitorDestroy(viewer);CHKERRQ(ierr); 353e7e93795SLois Curfman McInnes } 3543a40ed3dSBarry Smith PetscFunctionReturn(0); 355e7e93795SLois Curfman McInnes } 356e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */ 3574a2ae208SSatish Balay #undef __FUNCT__ 3583f149594SLisandro Dalcin #define __FUNCT__ "SNESDefaultConverged" 3594b828684SBarry Smith /*@C 3603f149594SLisandro Dalcin SNESDefaultConverged - Convergence test of the solvers for 361f525115eSLois Curfman McInnes systems of nonlinear equations (default). 362e7e93795SLois Curfman McInnes 363c7afd0dbSLois Curfman McInnes Collective on SNES 364c7afd0dbSLois Curfman McInnes 365e7e93795SLois Curfman McInnes Input Parameters: 366c7afd0dbSLois Curfman McInnes + snes - the SNES context 36706ee9f85SBarry Smith . it - the iteration (0 indicates before any Newton steps) 368e7e93795SLois Curfman McInnes . xnorm - 2-norm of current iterate 369e7e93795SLois Curfman McInnes . pnorm - 2-norm of current step 3707f3332b4SBarry Smith . fnorm - 2-norm of function at current iterate 371c7afd0dbSLois Curfman McInnes - dummy - unused context 372e7e93795SLois Curfman McInnes 373184914b5SBarry Smith Output Parameter: 374184914b5SBarry Smith . reason - one of 37570441072SBarry Smith $ SNES_CONVERGED_FNORM_ABS - (fnorm < abstol), 3763304466cSBarry Smith $ SNES_CONVERGED_PNORM_RELATIVE - (pnorm < xtol*xnorm), 377184914b5SBarry Smith $ SNES_CONVERGED_FNORM_RELATIVE - (fnorm < rtol*fnorm0), 378184914b5SBarry Smith $ SNES_DIVERGED_FUNCTION_COUNT - (nfct > maxf), 379184914b5SBarry Smith $ SNES_DIVERGED_FNORM_NAN - (fnorm == NaN), 380184914b5SBarry Smith $ SNES_CONVERGED_ITERATING - (otherwise), 381e7e93795SLois Curfman McInnes 382e7e93795SLois Curfman McInnes where 383c7afd0dbSLois Curfman McInnes + maxf - maximum number of function evaluations, 384c7afd0dbSLois Curfman McInnes set with SNESSetTolerances() 385c7afd0dbSLois Curfman McInnes . nfct - number of function evaluations, 38670441072SBarry Smith . abstol - absolute function norm tolerance, 387c7afd0dbSLois Curfman McInnes set with SNESSetTolerances() 388c7afd0dbSLois Curfman McInnes - rtol - relative function norm tolerance, set with SNESSetTolerances() 389fee21e36SBarry Smith 39036851e7fSLois Curfman McInnes Level: intermediate 39136851e7fSLois Curfman McInnes 392e7e93795SLois Curfman McInnes .keywords: SNES, nonlinear, default, converged, convergence 393e7e93795SLois Curfman McInnes 39471f87433Sdalcinl .seealso: SNESSetConvergenceTest() 395e7e93795SLois Curfman McInnes @*/ 3963f149594SLisandro Dalcin PetscErrorCode PETSCSNES_DLLEXPORT SNESDefaultConverged(SNES snes,PetscInt it,PetscReal xnorm,PetscReal pnorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy) 397e7e93795SLois Curfman McInnes { 39863ba0a88SBarry Smith PetscErrorCode ierr; 39963ba0a88SBarry Smith 4003a40ed3dSBarry Smith PetscFunctionBegin; 401*0700a824SBarry Smith PetscValidHeaderSpecific(snes,SNES_CLASSID,1); 4023f149594SLisandro Dalcin PetscValidPointer(reason,6); 4033f149594SLisandro Dalcin 40406ee9f85SBarry Smith *reason = SNES_CONVERGED_ITERATING; 40506ee9f85SBarry Smith 40606ee9f85SBarry Smith if (!it) { 40706ee9f85SBarry Smith /* set parameter for default relative tolerance convergence test */ 40806ee9f85SBarry Smith snes->ttol = fnorm*snes->rtol; 40906ee9f85SBarry Smith } 410d252947aSBarry Smith if (fnorm != fnorm) { 411ae15b995SBarry Smith ierr = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr); 412184914b5SBarry Smith *reason = SNES_DIVERGED_FNORM_NAN; 41370441072SBarry Smith } else if (fnorm < snes->abstol) { 414ae15b995SBarry Smith ierr = PetscInfo2(snes,"Converged due to function norm %G < %G\n",fnorm,snes->abstol);CHKERRQ(ierr); 415184914b5SBarry Smith *reason = SNES_CONVERGED_FNORM_ABS; 41643e71028SBarry Smith } else if (snes->nfuncs >= snes->max_funcs) { 417ae15b995SBarry Smith ierr = PetscInfo2(snes,"Exceeded maximum number of function evaluations: %D > %D\n",snes->nfuncs,snes->max_funcs);CHKERRQ(ierr); 418184914b5SBarry Smith *reason = SNES_DIVERGED_FUNCTION_COUNT; 41906ee9f85SBarry Smith } 42006ee9f85SBarry Smith 42106ee9f85SBarry Smith if (it && !*reason) { 42206ee9f85SBarry Smith if (fnorm <= snes->ttol) { 42306ee9f85SBarry Smith ierr = PetscInfo2(snes,"Converged due to function norm %G < %G (relative tolerance)\n",fnorm,snes->ttol);CHKERRQ(ierr); 42406ee9f85SBarry Smith *reason = SNES_CONVERGED_FNORM_RELATIVE; 42506ee9f85SBarry Smith } else if (pnorm < snes->xtol*xnorm) { 42606ee9f85SBarry Smith ierr = PetscInfo3(snes,"Converged due to small update length: %G < %G * %G\n",pnorm,snes->xtol,xnorm);CHKERRQ(ierr); 42706ee9f85SBarry Smith *reason = SNES_CONVERGED_PNORM_RELATIVE; 42806ee9f85SBarry Smith } 429e7e93795SLois Curfman McInnes } 4303a40ed3dSBarry Smith PetscFunctionReturn(0); 431e7e93795SLois Curfman McInnes } 4323f149594SLisandro Dalcin 4333f149594SLisandro Dalcin #undef __FUNCT__ 4343f149594SLisandro Dalcin #define __FUNCT__ "SNESSkipConverged" 4353f149594SLisandro Dalcin /*@C 4363f149594SLisandro Dalcin SNESSkipConverged - Convergence test for SNES that NEVER returns as 4373f149594SLisandro Dalcin converged, UNLESS the maximum number of iteration have been reached. 4383f149594SLisandro Dalcin 4393f149594SLisandro Dalcin Collective on SNES 4403f149594SLisandro Dalcin 4413f149594SLisandro Dalcin Input Parameters: 4423f149594SLisandro Dalcin + snes - the SNES context 4433f149594SLisandro Dalcin . it - the iteration (0 indicates before any Newton steps) 4443f149594SLisandro Dalcin . xnorm - 2-norm of current iterate 4453f149594SLisandro Dalcin . pnorm - 2-norm of current step 4463f149594SLisandro Dalcin . fnorm - 2-norm of function at current iterate 4473f149594SLisandro Dalcin - dummy - unused context 4483f149594SLisandro Dalcin 4493f149594SLisandro Dalcin Output Parameter: 45085385478SLisandro Dalcin . reason - SNES_CONVERGED_ITERATING, SNES_CONVERGED_ITS, or SNES_DIVERGED_FNORM_NAN 4513f149594SLisandro Dalcin 4523f149594SLisandro Dalcin Notes: 4533f149594SLisandro Dalcin Convergence is then declared after a fixed number of iterations have been used. 4543f149594SLisandro Dalcin 4553f149594SLisandro Dalcin Level: advanced 4563f149594SLisandro Dalcin 4573f149594SLisandro Dalcin .keywords: SNES, nonlinear, skip, converged, convergence 4583f149594SLisandro Dalcin 4593f149594SLisandro Dalcin .seealso: SNESSetConvergenceTest() 4603f149594SLisandro Dalcin @*/ 4613f149594SLisandro Dalcin PetscErrorCode PETSCSNES_DLLEXPORT SNESSkipConverged(SNES snes,PetscInt it,PetscReal xnorm,PetscReal pnorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy) 4623f149594SLisandro Dalcin { 4633f149594SLisandro Dalcin PetscErrorCode ierr; 4643f149594SLisandro Dalcin 4653f149594SLisandro Dalcin PetscFunctionBegin; 466*0700a824SBarry Smith PetscValidHeaderSpecific(snes,SNES_CLASSID,1); 4673f149594SLisandro Dalcin PetscValidPointer(reason,6); 4683f149594SLisandro Dalcin 4693f149594SLisandro Dalcin *reason = SNES_CONVERGED_ITERATING; 4703f149594SLisandro Dalcin 4713f149594SLisandro Dalcin if (fnorm != fnorm) { 4723f149594SLisandro Dalcin ierr = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr); 4733f149594SLisandro Dalcin *reason = SNES_DIVERGED_FNORM_NAN; 4743f149594SLisandro Dalcin } else if(it == snes->max_its) { 4753f149594SLisandro Dalcin *reason = SNES_CONVERGED_ITS; 4763f149594SLisandro Dalcin } 4773f149594SLisandro Dalcin PetscFunctionReturn(0); 4783f149594SLisandro Dalcin } 4793f149594SLisandro Dalcin 480