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