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 2036851e7fSLois Curfman McInnes Level: intermediate 213f1db9ecSBarry Smith 2236851e7fSLois Curfman McInnes .keywords: SNES, nonlinear, vector, monitor, view 233f1db9ecSBarry Smith 24a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView() 253f1db9ecSBarry Smith @*/ 26*d43b4f6eSBarry Smith PetscErrorCode SNESMonitorSolution(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf) 273f1db9ecSBarry Smith { 28dfbe8321SBarry Smith PetscErrorCode ierr; 293f1db9ecSBarry Smith Vec x; 30*d43b4f6eSBarry Smith PetscViewer viewer = vf->viewer; 313f1db9ecSBarry Smith 323f1db9ecSBarry Smith PetscFunctionBegin; 334d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 343f1db9ecSBarry Smith ierr = SNESGetSolution(snes,&x);CHKERRQ(ierr); 35*d43b4f6eSBarry Smith ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr); 363f1db9ecSBarry Smith ierr = VecView(x,viewer);CHKERRQ(ierr); 37*d43b4f6eSBarry Smith ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 383f1db9ecSBarry Smith PetscFunctionReturn(0); 393f1db9ecSBarry Smith } 403f1db9ecSBarry Smith 414a2ae208SSatish Balay #undef __FUNCT__ 42a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorResidual" 435ed2d596SBarry Smith /*@C 44a6570f20SBarry Smith SNESMonitorResidual - Monitors progress of the SNES solvers by calling 455ed2d596SBarry Smith VecView() for the residual at each iteration. 465ed2d596SBarry Smith 475ed2d596SBarry Smith Collective on SNES 485ed2d596SBarry Smith 495ed2d596SBarry Smith Input Parameters: 505ed2d596SBarry Smith + snes - the SNES context 515ed2d596SBarry Smith . its - iteration number 524b27c08aSLois Curfman McInnes . fgnorm - 2-norm of residual 53f55353a2SBarry Smith - dummy - a viewer 545ed2d596SBarry Smith 555ed2d596SBarry Smith Level: intermediate 565ed2d596SBarry Smith 575ed2d596SBarry Smith .keywords: SNES, nonlinear, vector, monitor, view 585ed2d596SBarry Smith 59a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView() 605ed2d596SBarry Smith @*/ 61*d43b4f6eSBarry Smith PetscErrorCode SNESMonitorResidual(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf) 625ed2d596SBarry Smith { 63dfbe8321SBarry Smith PetscErrorCode ierr; 645ed2d596SBarry Smith Vec x; 65*d43b4f6eSBarry Smith PetscViewer viewer = vf->viewer; 665ed2d596SBarry Smith 675ed2d596SBarry Smith PetscFunctionBegin; 684d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 695ed2d596SBarry Smith ierr = SNESGetFunction(snes,&x,0,0);CHKERRQ(ierr); 70*d43b4f6eSBarry Smith ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr); 715ed2d596SBarry Smith ierr = VecView(x,viewer);CHKERRQ(ierr); 72*d43b4f6eSBarry Smith ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 735ed2d596SBarry Smith PetscFunctionReturn(0); 745ed2d596SBarry Smith } 755ed2d596SBarry Smith 765ed2d596SBarry Smith #undef __FUNCT__ 77a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorSolutionUpdate" 78d132466eSBarry Smith /*@C 79a6570f20SBarry Smith SNESMonitorSolutionUpdate - Monitors progress of the SNES solvers by calling 80d132466eSBarry Smith VecView() for the UPDATE to the solution at each iteration. 81d132466eSBarry Smith 82d132466eSBarry Smith Collective on SNES 83d132466eSBarry Smith 84d132466eSBarry Smith Input Parameters: 85d132466eSBarry Smith + snes - the SNES context 86d132466eSBarry Smith . its - iteration number 874b27c08aSLois Curfman McInnes . fgnorm - 2-norm of residual 88f55353a2SBarry Smith - dummy - a viewer 89d132466eSBarry Smith 90d132466eSBarry Smith Level: intermediate 91d132466eSBarry Smith 92d132466eSBarry Smith .keywords: SNES, nonlinear, vector, monitor, view 93d132466eSBarry Smith 94a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView() 95d132466eSBarry Smith @*/ 96*d43b4f6eSBarry Smith PetscErrorCode SNESMonitorSolutionUpdate(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf) 97d132466eSBarry Smith { 98dfbe8321SBarry Smith PetscErrorCode ierr; 99d132466eSBarry Smith Vec x; 100*d43b4f6eSBarry Smith PetscViewer viewer = vf->viewer; 101d132466eSBarry Smith 102d132466eSBarry Smith PetscFunctionBegin; 1034d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 104d132466eSBarry Smith ierr = SNESGetSolutionUpdate(snes,&x);CHKERRQ(ierr); 105*d43b4f6eSBarry Smith ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr); 106d132466eSBarry Smith ierr = VecView(x,viewer);CHKERRQ(ierr); 107*d43b4f6eSBarry Smith ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 108d132466eSBarry Smith PetscFunctionReturn(0); 109d132466eSBarry Smith } 110d132466eSBarry Smith 1114a2ae208SSatish Balay #undef __FUNCT__ 112a5c2985bSBarry Smith #define __FUNCT__ "KSPMonitorSNES" 113a5c2985bSBarry Smith /*@C 114a5c2985bSBarry Smith KSPMonitorSNES - Print the residual norm of the nonlinear function at each iteration of the linear iterative solver. 115a5c2985bSBarry Smith 116a5c2985bSBarry Smith Collective on KSP 117a5c2985bSBarry Smith 118a5c2985bSBarry Smith Input Parameters: 119a5c2985bSBarry Smith + ksp - iterative context 120a5c2985bSBarry Smith . n - iteration number 121a5c2985bSBarry Smith . rnorm - 2-norm (preconditioned) residual value (may be estimated). 122a5c2985bSBarry Smith - dummy - unused monitor context 123a5c2985bSBarry Smith 124a5c2985bSBarry Smith Level: intermediate 125a5c2985bSBarry Smith 126a5c2985bSBarry Smith .keywords: KSP, default, monitor, residual 127a5c2985bSBarry Smith 128a5c2985bSBarry Smith .seealso: KSPMonitorSet(), KSPMonitorTrueResidualNorm(), KSPMonitorLGResidualNormCreate() 129a5c2985bSBarry Smith @*/ 130a5c2985bSBarry Smith PetscErrorCode KSPMonitorSNES(KSP ksp,PetscInt n,PetscReal rnorm,void *dummy) 131a5c2985bSBarry Smith { 132a5c2985bSBarry Smith PetscErrorCode ierr; 133a5c2985bSBarry Smith PetscViewer viewer; 134a5c2985bSBarry Smith SNES snes = (SNES) dummy; 135a5c2985bSBarry Smith Vec snes_solution,work1,work2; 136a5c2985bSBarry Smith PetscReal snorm; 137a5c2985bSBarry Smith 138a5c2985bSBarry Smith PetscFunctionBegin; 139a5c2985bSBarry Smith ierr = SNESGetSolution(snes,&snes_solution);CHKERRQ(ierr); 140a5c2985bSBarry Smith ierr = VecDuplicate(snes_solution,&work1);CHKERRQ(ierr); 141a5c2985bSBarry Smith ierr = VecDuplicate(snes_solution,&work2);CHKERRQ(ierr); 142a5c2985bSBarry Smith ierr = KSPBuildSolution(ksp,work1,NULL);CHKERRQ(ierr); 143a5c2985bSBarry Smith ierr = VecAYPX(work1,-1.0,snes_solution);CHKERRQ(ierr); 144a5c2985bSBarry Smith ierr = SNESComputeFunction(snes,work1,work2);CHKERRQ(ierr); 145a5c2985bSBarry Smith ierr = VecNorm(work2,NORM_2,&snorm);CHKERRQ(ierr); 146a5c2985bSBarry Smith ierr = VecDestroy(&work1);CHKERRQ(ierr); 147a5c2985bSBarry Smith ierr = VecDestroy(&work2);CHKERRQ(ierr); 148a5c2985bSBarry Smith 149a5c2985bSBarry Smith ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ksp),&viewer);CHKERRQ(ierr); 150a5c2985bSBarry Smith ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr); 151a5c2985bSBarry Smith if (n == 0 && ((PetscObject)ksp)->prefix) { 152a5c2985bSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Residual norms for %s solve.\n",((PetscObject)ksp)->prefix);CHKERRQ(ierr); 153a5c2985bSBarry Smith } 154a5c2985bSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Residual norm %5.3e KSP Residual norm %5.3e \n",n,(double)snorm,(double)rnorm);CHKERRQ(ierr); 155a5c2985bSBarry Smith ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr); 156a5c2985bSBarry Smith PetscFunctionReturn(0); 157a5c2985bSBarry Smith } 158a5c2985bSBarry Smith 159e5f7ee39SBarry Smith #include <petscdraw.h> 160e5f7ee39SBarry Smith 161e5f7ee39SBarry Smith #undef __FUNCT__ 162e5f7ee39SBarry Smith #define __FUNCT__ "KSPMonitorSNESLGResidualNormCreate" 163e5f7ee39SBarry Smith /*@C 164e5f7ee39SBarry Smith KSPMonitorSNESLGResidualNormCreate - Creates a line graph context for use with 165e5f7ee39SBarry Smith KSP to monitor convergence of preconditioned residual norms. 166e5f7ee39SBarry Smith 167e5f7ee39SBarry Smith Collective on KSP 168e5f7ee39SBarry Smith 169e5f7ee39SBarry Smith Input Parameters: 1708b0b5a47SLisandro Dalcin + comm - communicator context 1718b0b5a47SLisandro Dalcin . host - the X display to open, or null for the local machine 172e5f7ee39SBarry Smith . label - the title to put in the title bar 173e5f7ee39SBarry Smith . x, y - the screen coordinates of the upper left coordinate of 174e5f7ee39SBarry Smith the window 175e5f7ee39SBarry Smith - m, n - the screen width and height in pixels 176e5f7ee39SBarry Smith 177e5f7ee39SBarry Smith Output Parameter: 178e5f7ee39SBarry Smith . draw - the drawing context 179e5f7ee39SBarry Smith 180e5f7ee39SBarry Smith Options Database Key: 181e5f7ee39SBarry Smith . -ksp_monitor_lg_residualnorm - Sets line graph monitor 182e5f7ee39SBarry Smith 183e5f7ee39SBarry Smith Notes: 184e5f7ee39SBarry Smith Use KSPMonitorSNESLGResidualNormDestroy() to destroy this line graph; do not use PetscDrawLGDestroy(). 185e5f7ee39SBarry Smith 186e5f7ee39SBarry Smith Level: intermediate 187e5f7ee39SBarry Smith 188e5f7ee39SBarry Smith .keywords: KSP, monitor, line graph, residual, create 189e5f7ee39SBarry Smith 190e5f7ee39SBarry Smith .seealso: KSPMonitorSNESLGResidualNormDestroy(), KSPMonitorSet(), KSPMonitorSNESLGTrueResidualCreate() 191e5f7ee39SBarry Smith @*/ 1928b0b5a47SLisandro Dalcin PetscErrorCode KSPMonitorSNESLGResidualNormCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscObject **objs) 193e5f7ee39SBarry Smith { 194e5f7ee39SBarry Smith PetscDraw draw; 195e5f7ee39SBarry Smith PetscErrorCode ierr; 196e5f7ee39SBarry Smith PetscDrawAxis axis; 197c36cb520SLisandro Dalcin PetscDrawLG lg; 198e5f7ee39SBarry Smith const char *names[] = {"Linear residual","Nonlinear residual"}; 199e5f7ee39SBarry Smith 200e5f7ee39SBarry Smith PetscFunctionBegin; 2018b0b5a47SLisandro Dalcin ierr = PetscDrawCreate(comm,host,label,x,y,m,n,&draw);CHKERRQ(ierr); 202e5f7ee39SBarry Smith ierr = PetscDrawSetFromOptions(draw);CHKERRQ(ierr); 203c36cb520SLisandro Dalcin ierr = PetscDrawLGCreate(draw,2,&lg);CHKERRQ(ierr); 204c36cb520SLisandro Dalcin ierr = PetscDrawLGSetLegend(lg,names);CHKERRQ(ierr); 205c36cb520SLisandro Dalcin ierr = PetscDrawLGSetFromOptions(lg);CHKERRQ(ierr); 206c36cb520SLisandro Dalcin ierr = PetscDrawLGGetAxis(lg,&axis);CHKERRQ(ierr); 207e5f7ee39SBarry Smith ierr = PetscDrawAxisSetLabels(axis,"Convergence of Residual Norm","Iteration","Residual Norm");CHKERRQ(ierr); 208c36cb520SLisandro Dalcin ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr); 209e5f7ee39SBarry Smith 210c36cb520SLisandro Dalcin ierr = PetscMalloc1(2,objs);CHKERRQ(ierr); 211c36cb520SLisandro Dalcin (*objs)[1] = (PetscObject)lg; 212e5f7ee39SBarry Smith PetscFunctionReturn(0); 213e5f7ee39SBarry Smith } 214e5f7ee39SBarry Smith 215e5f7ee39SBarry Smith #undef __FUNCT__ 216e5f7ee39SBarry Smith #define __FUNCT__ "KSPMonitorSNESLGResidualNorm" 217e5f7ee39SBarry Smith PetscErrorCode KSPMonitorSNESLGResidualNorm(KSP ksp,PetscInt n,PetscReal rnorm,PetscObject *objs) 218e5f7ee39SBarry Smith { 219c36cb520SLisandro Dalcin SNES snes = (SNES) objs[0]; 220e5f7ee39SBarry Smith PetscDrawLG lg = (PetscDrawLG) objs[1]; 221e5f7ee39SBarry Smith PetscErrorCode ierr; 222e5f7ee39SBarry Smith PetscReal y[2]; 223e5f7ee39SBarry Smith Vec snes_solution,work1,work2; 224e5f7ee39SBarry Smith 225e5f7ee39SBarry Smith PetscFunctionBegin; 226e5f7ee39SBarry Smith if (rnorm > 0.0) y[0] = PetscLog10Real(rnorm); 227e5f7ee39SBarry Smith else y[0] = -15.0; 228e5f7ee39SBarry Smith 229e5f7ee39SBarry Smith ierr = SNESGetSolution(snes,&snes_solution);CHKERRQ(ierr); 230e5f7ee39SBarry Smith ierr = VecDuplicate(snes_solution,&work1);CHKERRQ(ierr); 231e5f7ee39SBarry Smith ierr = VecDuplicate(snes_solution,&work2);CHKERRQ(ierr); 232e5f7ee39SBarry Smith ierr = KSPBuildSolution(ksp,work1,NULL);CHKERRQ(ierr); 233e5f7ee39SBarry Smith ierr = VecAYPX(work1,-1.0,snes_solution);CHKERRQ(ierr); 234e5f7ee39SBarry Smith ierr = SNESComputeFunction(snes,work1,work2);CHKERRQ(ierr); 235e5f7ee39SBarry Smith ierr = VecNorm(work2,NORM_2,y+1);CHKERRQ(ierr); 236e5f7ee39SBarry Smith if (y[1] > 0.0) y[1] = PetscLog10Real(y[1]); 237e5f7ee39SBarry Smith else y[1] = -15.0; 238e5f7ee39SBarry Smith ierr = VecDestroy(&work1);CHKERRQ(ierr); 239e5f7ee39SBarry Smith ierr = VecDestroy(&work2);CHKERRQ(ierr); 240e5f7ee39SBarry Smith 241e5f7ee39SBarry Smith ierr = PetscDrawLGAddPoint(lg,NULL,y);CHKERRQ(ierr); 2426934998bSLisandro Dalcin if (n < 20 || !(n % 5) || snes->reason) { 243e5f7ee39SBarry Smith ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr); 2446934998bSLisandro Dalcin ierr = PetscDrawLGSave(lg);CHKERRQ(ierr); 245e5f7ee39SBarry Smith } 246e5f7ee39SBarry Smith PetscFunctionReturn(0); 247e5f7ee39SBarry Smith } 248e5f7ee39SBarry Smith 249e5f7ee39SBarry Smith #undef __FUNCT__ 250e5f7ee39SBarry Smith #define __FUNCT__ "KSPMonitorSNESLGResidualNormDestroy" 251e5f7ee39SBarry Smith /*@ 252e5f7ee39SBarry Smith KSPMonitorSNESLGResidualNormDestroy - Destroys a line graph context that was created 253e5f7ee39SBarry Smith with KSPMonitorSNESLGResidualNormCreate(). 254e5f7ee39SBarry Smith 255e5f7ee39SBarry Smith Collective on KSP 256e5f7ee39SBarry Smith 257e5f7ee39SBarry Smith Input Parameter: 258e5f7ee39SBarry Smith . draw - the drawing context 259e5f7ee39SBarry Smith 260e5f7ee39SBarry Smith Level: intermediate 261e5f7ee39SBarry Smith 262e5f7ee39SBarry Smith .keywords: KSP, monitor, line graph, destroy 263e5f7ee39SBarry Smith 264e5f7ee39SBarry Smith .seealso: KSPMonitorSNESLGResidualNormCreate(), KSPMonitorSNESLGTrueResidualDestroy(), KSPMonitorSet() 265e5f7ee39SBarry Smith @*/ 266e5f7ee39SBarry Smith PetscErrorCode KSPMonitorSNESLGResidualNormDestroy(PetscObject **objs) 267e5f7ee39SBarry Smith { 268e5f7ee39SBarry Smith PetscErrorCode ierr; 269c36cb520SLisandro Dalcin PetscDrawLG lg = (PetscDrawLG) (*objs)[1]; 270e5f7ee39SBarry Smith 271e5f7ee39SBarry Smith PetscFunctionBegin; 272c36cb520SLisandro Dalcin ierr = PetscDrawLGDestroy(&lg);CHKERRQ(ierr); 273e5f7ee39SBarry Smith ierr = PetscFree(*objs);CHKERRQ(ierr); 274e5f7ee39SBarry Smith PetscFunctionReturn(0); 275e5f7ee39SBarry Smith } 276e5f7ee39SBarry Smith 277a5c2985bSBarry Smith #undef __FUNCT__ 278a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorDefault" 2794b828684SBarry Smith /*@C 280a6570f20SBarry Smith SNESMonitorDefault - Monitors progress of the SNES solvers (default). 281e7e93795SLois Curfman McInnes 282c7afd0dbSLois Curfman McInnes Collective on SNES 283c7afd0dbSLois Curfman McInnes 284e7e93795SLois Curfman McInnes Input Parameters: 285c7afd0dbSLois Curfman McInnes + snes - the SNES context 286e7e93795SLois Curfman McInnes . its - iteration number 2874b27c08aSLois Curfman McInnes . fgnorm - 2-norm of residual 288*d43b4f6eSBarry Smith - vf - viewer and format structure 289fee21e36SBarry Smith 290e7e93795SLois Curfman McInnes Notes: 2914b27c08aSLois Curfman McInnes This routine prints the residual norm at each iteration. 292e7e93795SLois Curfman McInnes 29336851e7fSLois Curfman McInnes Level: intermediate 29436851e7fSLois Curfman McInnes 295e7e93795SLois Curfman McInnes .keywords: SNES, nonlinear, default, monitor, norm 296e7e93795SLois Curfman McInnes 297a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution() 298e7e93795SLois Curfman McInnes @*/ 299*d43b4f6eSBarry Smith PetscErrorCode SNESMonitorDefault(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf) 300e7e93795SLois Curfman McInnes { 301dfbe8321SBarry Smith PetscErrorCode ierr; 302*d43b4f6eSBarry Smith PetscViewer viewer = vf->viewer; 303d132466eSBarry Smith 3043a40ed3dSBarry Smith PetscFunctionBegin; 3054d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 306*d43b4f6eSBarry Smith ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr); 307649052a6SBarry Smith ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 308649052a6SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e \n",its,(double)fgnorm);CHKERRQ(ierr); 309649052a6SBarry Smith ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 310*d43b4f6eSBarry Smith ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr) ; 3113a40ed3dSBarry Smith PetscFunctionReturn(0); 312e7e93795SLois Curfman McInnes } 3133f1db9ecSBarry Smith 314b271bb04SBarry Smith #undef __FUNCT__ 3152e7541e6SPeter Brune #define __FUNCT__ "SNESMonitorJacUpdateSpectrum" 316*d43b4f6eSBarry Smith PetscErrorCode SNESMonitorJacUpdateSpectrum(SNES snes,PetscInt it,PetscReal fnorm,PetscViewerAndFormat *vf) 317a80ad3e0SBarry Smith { 318196da8b6SPeter Brune #if defined(PETSC_MISSING_LAPACK_GEEV) 319ce94432eSBarry Smith SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_SUP,"GEEV - Lapack routine is unavailable\nNot able to provide eigen values."); 320196da8b6SPeter Brune #elif defined(PETSC_HAVE_ESSL) 321ce94432eSBarry Smith SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_SUP,"GEEV - No support for ESSL Lapack Routines"); 322196da8b6SPeter Brune #else 3232e7541e6SPeter Brune Vec X; 3242e7541e6SPeter Brune Mat J,dJ,dJdense; 3252e7541e6SPeter Brune PetscErrorCode ierr; 326d1e9a80fSBarry Smith PetscErrorCode (*func)(SNES,Vec,Mat,Mat,void*); 3272e7541e6SPeter Brune PetscInt n,i; 3282e7541e6SPeter Brune PetscBLASInt nb,lwork; 3292e7541e6SPeter Brune PetscReal *eigr,*eigi; 3302e7541e6SPeter Brune PetscScalar *work; 3312e7541e6SPeter Brune PetscScalar *a; 3322e7541e6SPeter Brune 3332e7541e6SPeter Brune PetscFunctionBegin; 3342e7541e6SPeter Brune if (it == 0) PetscFunctionReturn(0); 3352e7541e6SPeter Brune /* create the difference between the current update and the current jacobian */ 3362e7541e6SPeter Brune ierr = SNESGetSolution(snes,&X);CHKERRQ(ierr); 337d1e9a80fSBarry Smith ierr = SNESGetJacobian(snes,NULL,&J,&func,NULL);CHKERRQ(ierr); 3382e7541e6SPeter Brune ierr = MatDuplicate(J,MAT_COPY_VALUES,&dJ);CHKERRQ(ierr); 339d1e9a80fSBarry Smith ierr = SNESComputeJacobian(snes,X,dJ,dJ);CHKERRQ(ierr); 3402e7541e6SPeter Brune ierr = MatAXPY(dJ,-1.0,J,SAME_NONZERO_PATTERN);CHKERRQ(ierr); 341f5af7f23SKarl Rupp 3422e7541e6SPeter Brune /* compute the spectrum directly */ 3432e7541e6SPeter Brune ierr = MatConvert(dJ,MATSEQDENSE,MAT_INITIAL_MATRIX,&dJdense);CHKERRQ(ierr); 3440298fd71SBarry Smith ierr = MatGetSize(dJ,&n,NULL);CHKERRQ(ierr); 345c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nb);CHKERRQ(ierr); 3462e7541e6SPeter Brune lwork = 3*nb; 347785e854fSJed Brown ierr = PetscMalloc1(n,&eigr);CHKERRQ(ierr); 348785e854fSJed Brown ierr = PetscMalloc1(n,&eigi);CHKERRQ(ierr); 349785e854fSJed Brown ierr = PetscMalloc1(lwork,&work);CHKERRQ(ierr); 3508c778c55SBarry Smith ierr = MatDenseGetArray(dJdense,&a);CHKERRQ(ierr); 3512e7541e6SPeter Brune #if !defined(PETSC_USE_COMPLEX) 3522e7541e6SPeter Brune { 3532e7541e6SPeter Brune PetscBLASInt lierr; 3542e7541e6SPeter Brune ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 3558b83055fSJed Brown PetscStackCallBLAS("LAPACKgeev",LAPACKgeev_("N","N",&nb,a,&nb,eigr,eigi,NULL,&nb,NULL,&nb,work,&lwork,&lierr)); 3562e7541e6SPeter Brune if (lierr) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"geev() error %d",lierr); 3572e7541e6SPeter Brune ierr = PetscFPTrapPop();CHKERRQ(ierr); 3582e7541e6SPeter Brune } 3592e7541e6SPeter Brune #else 3602e7541e6SPeter Brune SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Not coded for complex"); 3612e7541e6SPeter Brune #endif 362fde5950dSBarry Smith ierr = PetscPrintf(PetscObjectComm((PetscObject)snes),"Eigenvalues of J_%d - J_%d:\n",it,it-1);CHKERRQ(ierr); 3632e7541e6SPeter Brune for (i=0;i<n;i++) { 364fde5950dSBarry Smith ierr = PetscPrintf(PetscObjectComm((PetscObject)snes),"%5d: %20.5g + %20.5gi\n",i,(double)eigr[i],(double)eigi[i]);CHKERRQ(ierr); 3652e7541e6SPeter Brune } 3668c778c55SBarry Smith ierr = MatDenseRestoreArray(dJdense,&a);CHKERRQ(ierr); 3672e7541e6SPeter Brune ierr = MatDestroy(&dJ);CHKERRQ(ierr); 3682e7541e6SPeter Brune ierr = MatDestroy(&dJdense);CHKERRQ(ierr); 3692e7541e6SPeter Brune ierr = PetscFree(eigr);CHKERRQ(ierr); 3702e7541e6SPeter Brune ierr = PetscFree(eigi);CHKERRQ(ierr); 3712e7541e6SPeter Brune ierr = PetscFree(work);CHKERRQ(ierr); 3722e7541e6SPeter Brune PetscFunctionReturn(0); 373196da8b6SPeter Brune #endif 3742e7541e6SPeter Brune } 3752e7541e6SPeter Brune 3762e7541e6SPeter Brune #undef __FUNCT__ 377b271bb04SBarry Smith #define __FUNCT__ "SNESMonitorRange_Private" 3787087cfbeSBarry Smith PetscErrorCode SNESMonitorRange_Private(SNES snes,PetscInt it,PetscReal *per) 379b271bb04SBarry Smith { 380b271bb04SBarry Smith PetscErrorCode ierr; 381b271bb04SBarry Smith Vec resid; 382b271bb04SBarry Smith PetscReal rmax,pwork; 383b271bb04SBarry Smith PetscInt i,n,N; 384b271bb04SBarry Smith PetscScalar *r; 385b271bb04SBarry Smith 386b271bb04SBarry Smith PetscFunctionBegin; 387b271bb04SBarry Smith ierr = SNESGetFunction(snes,&resid,0,0);CHKERRQ(ierr); 388b271bb04SBarry Smith ierr = VecNorm(resid,NORM_INFINITY,&rmax);CHKERRQ(ierr); 389b271bb04SBarry Smith ierr = VecGetLocalSize(resid,&n);CHKERRQ(ierr); 390b271bb04SBarry Smith ierr = VecGetSize(resid,&N);CHKERRQ(ierr); 391b271bb04SBarry Smith ierr = VecGetArray(resid,&r);CHKERRQ(ierr); 392b271bb04SBarry Smith pwork = 0.0; 393b271bb04SBarry Smith for (i=0; i<n; i++) { 394b271bb04SBarry Smith pwork += (PetscAbsScalar(r[i]) > .20*rmax); 395b271bb04SBarry Smith } 396b2566f29SBarry Smith ierr = MPIU_Allreduce(&pwork,per,1,MPIU_REAL,MPIU_SUM,PetscObjectComm((PetscObject)snes));CHKERRQ(ierr); 397b271bb04SBarry Smith ierr = VecRestoreArray(resid,&r);CHKERRQ(ierr); 398b271bb04SBarry Smith *per = *per/N; 399b271bb04SBarry Smith PetscFunctionReturn(0); 400b271bb04SBarry Smith } 401b271bb04SBarry Smith 402b271bb04SBarry Smith #undef __FUNCT__ 403b271bb04SBarry Smith #define __FUNCT__ "SNESMonitorRange" 404b271bb04SBarry Smith /*@C 405b271bb04SBarry Smith SNESMonitorRange - Prints the percentage of residual elements that are more then 10 percent of the maximum value. 406b271bb04SBarry Smith 407b271bb04SBarry Smith Collective on SNES 408b271bb04SBarry Smith 409b271bb04SBarry Smith Input Parameters: 410b271bb04SBarry Smith + snes - iterative context 411b271bb04SBarry Smith . it - iteration number 412b271bb04SBarry Smith . rnorm - 2-norm (preconditioned) residual value (may be estimated). 413b271bb04SBarry Smith - dummy - unused monitor context 414b271bb04SBarry Smith 415b271bb04SBarry Smith Options Database Key: 416b271bb04SBarry Smith . -snes_monitor_range - Activates SNESMonitorRange() 417b271bb04SBarry Smith 418b271bb04SBarry Smith Level: intermediate 419b271bb04SBarry Smith 420b271bb04SBarry Smith .keywords: SNES, default, monitor, residual 421b271bb04SBarry Smith 422b271bb04SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), SNESMonitorLGCreate() 423b271bb04SBarry Smith @*/ 424*d43b4f6eSBarry Smith PetscErrorCode SNESMonitorRange(SNES snes,PetscInt it,PetscReal rnorm,PetscViewerAndFormat *vf) 425b271bb04SBarry Smith { 426b271bb04SBarry Smith PetscErrorCode ierr; 427b271bb04SBarry Smith PetscReal perc,rel; 428*d43b4f6eSBarry Smith PetscViewer viewer = vf->viewer; 429b271bb04SBarry Smith /* should be in a MonitorRangeContext */ 430b271bb04SBarry Smith static PetscReal prev; 431b271bb04SBarry Smith 432b271bb04SBarry Smith PetscFunctionBegin; 4334d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 434b271bb04SBarry Smith if (!it) prev = rnorm; 435b271bb04SBarry Smith ierr = SNESMonitorRange_Private(snes,it,&perc);CHKERRQ(ierr); 436b271bb04SBarry Smith 437b271bb04SBarry Smith rel = (prev - rnorm)/prev; 438b271bb04SBarry Smith prev = rnorm; 439*d43b4f6eSBarry Smith ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr); 440649052a6SBarry Smith ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 4416712e2f1SBarry 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); 442649052a6SBarry Smith ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 443*d43b4f6eSBarry Smith ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 444b271bb04SBarry Smith PetscFunctionReturn(0); 445b271bb04SBarry Smith } 446b271bb04SBarry Smith 4473a7fca6bSBarry Smith #undef __FUNCT__ 448a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorRatio" 4493a7fca6bSBarry Smith /*@C 450a6570f20SBarry Smith SNESMonitorRatio - Monitors progress of the SNES solvers by printing the ratio 4514b27c08aSLois Curfman McInnes of residual norm at each iteration to the previous. 4523a7fca6bSBarry Smith 4533a7fca6bSBarry Smith Collective on SNES 4543a7fca6bSBarry Smith 4553a7fca6bSBarry Smith Input Parameters: 4563a7fca6bSBarry Smith + snes - the SNES context 4573a7fca6bSBarry Smith . its - iteration number 4583a7fca6bSBarry Smith . fgnorm - 2-norm of residual (or gradient) 459eabae89aSBarry Smith - dummy - context of monitor 4603a7fca6bSBarry Smith 4613a7fca6bSBarry Smith Level: intermediate 4623a7fca6bSBarry Smith 463fde5950dSBarry Smith Notes: Insure that SNESMonitorRatio() is called when you set this monitor 4643a7fca6bSBarry Smith .keywords: SNES, nonlinear, monitor, norm 4653a7fca6bSBarry Smith 466fde5950dSBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorRatio() 4673a7fca6bSBarry Smith @*/ 468*d43b4f6eSBarry Smith PetscErrorCode SNESMonitorRatio(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf) 4693a7fca6bSBarry Smith { 470dfbe8321SBarry Smith PetscErrorCode ierr; 47177431f27SBarry Smith PetscInt len; 47287828ca2SBarry Smith PetscReal *history; 473*d43b4f6eSBarry Smith PetscViewer viewer = vf->viewer; 4743a7fca6bSBarry Smith 4753a7fca6bSBarry Smith PetscFunctionBegin; 4760298fd71SBarry Smith ierr = SNESGetConvergenceHistory(snes,&history,NULL,&len);CHKERRQ(ierr); 477*d43b4f6eSBarry Smith ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr); 478fde5950dSBarry Smith ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 479958c9bccSBarry Smith if (!its || !history || its > len) { 480fde5950dSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e \n",its,(double)fgnorm);CHKERRQ(ierr); 4813a7fca6bSBarry Smith } else { 48287828ca2SBarry Smith PetscReal ratio = fgnorm/history[its-1]; 483fde5950dSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e %14.12e \n",its,(double)fgnorm,(double)ratio);CHKERRQ(ierr); 4843a7fca6bSBarry Smith } 485fde5950dSBarry Smith ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 486*d43b4f6eSBarry Smith ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 4873a7fca6bSBarry Smith PetscFunctionReturn(0); 4883a7fca6bSBarry Smith } 4893a7fca6bSBarry Smith 4903a7fca6bSBarry Smith #undef __FUNCT__ 491fde5950dSBarry Smith #define __FUNCT__ "SNESMonitorRatioSetUp" 4923a7fca6bSBarry Smith /*@C 493fde5950dSBarry Smith SNESMonitorRatioSetUp - Insures the SNES object is saving its history since this monitor needs access to it 4943a7fca6bSBarry Smith 4953a7fca6bSBarry Smith Collective on SNES 4963a7fca6bSBarry Smith 4973a7fca6bSBarry Smith Input Parameters: 498eabae89aSBarry Smith + snes - the SNES context 499fde5950dSBarry Smith - viewer - the PetscViewer object (ignored) 5003a7fca6bSBarry Smith 5013a7fca6bSBarry Smith Level: intermediate 5023a7fca6bSBarry Smith 5033a7fca6bSBarry Smith .keywords: SNES, nonlinear, monitor, norm 5043a7fca6bSBarry Smith 505fde5950dSBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault(), SNESMonitorRatio() 5063a7fca6bSBarry Smith @*/ 507*d43b4f6eSBarry Smith PetscErrorCode SNESMonitorRatioSetUp(SNES snes,PetscViewerAndFormat *vf) 5083a7fca6bSBarry Smith { 509dfbe8321SBarry Smith PetscErrorCode ierr; 51087828ca2SBarry Smith PetscReal *history; 5113a7fca6bSBarry Smith 5123a7fca6bSBarry Smith PetscFunctionBegin; 5130298fd71SBarry Smith ierr = SNESGetConvergenceHistory(snes,&history,NULL,NULL);CHKERRQ(ierr); 5143a7fca6bSBarry Smith if (!history) { 515fde5950dSBarry Smith ierr = SNESSetConvergenceHistory(snes,NULL,NULL,100,PETSC_TRUE);CHKERRQ(ierr); 5163a7fca6bSBarry Smith } 5173a7fca6bSBarry Smith PetscFunctionReturn(0); 5183a7fca6bSBarry Smith } 5193a7fca6bSBarry Smith 520e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */ 5214a2ae208SSatish Balay #undef __FUNCT__ 522a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorDefaultShort" 523be1f7002SBarry Smith /* 524a6570f20SBarry Smith Default (short) SNES Monitor, same as SNESMonitorDefault() except 525be1f7002SBarry Smith it prints fewer digits of the residual as the residual gets smaller. 526be1f7002SBarry Smith This is because the later digits are meaningless and are often 527be1f7002SBarry Smith different on different machines; by using this routine different 528be1f7002SBarry Smith machines will usually generate the same output. 529be1f7002SBarry Smith */ 530*d43b4f6eSBarry Smith PetscErrorCode SNESMonitorDefaultShort(SNES snes,PetscInt its,PetscReal fgnorm,PetscViewerAndFormat *vf) 531e7e93795SLois Curfman McInnes { 532dfbe8321SBarry Smith PetscErrorCode ierr; 533*d43b4f6eSBarry Smith PetscViewer viewer = vf->viewer; 534d132466eSBarry Smith 5353a40ed3dSBarry Smith PetscFunctionBegin; 5364d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 537*d43b4f6eSBarry Smith ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr); 538649052a6SBarry Smith ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 5398f240d10SBarry Smith if (fgnorm > 1.e-9) { 5408fa295daSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %g \n",its,(double)fgnorm);CHKERRQ(ierr); 5413a40ed3dSBarry Smith } else if (fgnorm > 1.e-11) { 5428fa295daSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %5.3e \n",its,(double)fgnorm);CHKERRQ(ierr); 5433a40ed3dSBarry Smith } else { 544649052a6SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm < 1.e-11\n",its);CHKERRQ(ierr); 545a34d58ebSBarry Smith } 546649052a6SBarry Smith ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 547*d43b4f6eSBarry Smith ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 5483a40ed3dSBarry Smith PetscFunctionReturn(0); 549e7e93795SLois Curfman McInnes } 5502db13446SMatthew G. Knepley 5512db13446SMatthew G. Knepley #undef __FUNCT__ 5522db13446SMatthew G. Knepley #define __FUNCT__ "SNESMonitorDefaultField" 5532db13446SMatthew G. Knepley /*@C 5542db13446SMatthew G. Knepley SNESMonitorDefaultField - Monitors progress of the SNES solvers, separated into fields. 5552db13446SMatthew G. Knepley 5562db13446SMatthew G. Knepley Collective on SNES 5572db13446SMatthew G. Knepley 5582db13446SMatthew G. Knepley Input Parameters: 5592db13446SMatthew G. Knepley + snes - the SNES context 5602db13446SMatthew G. Knepley . its - iteration number 5612db13446SMatthew G. Knepley . fgnorm - 2-norm of residual 5622db13446SMatthew G. Knepley - ctx - the PetscViewer 5632db13446SMatthew G. Knepley 5642db13446SMatthew G. Knepley Notes: 5652db13446SMatthew G. Knepley This routine uses the DM attached to the residual vector 5662db13446SMatthew G. Knepley 5672db13446SMatthew G. Knepley Level: intermediate 5682db13446SMatthew G. Knepley 5692db13446SMatthew G. Knepley .keywords: SNES, nonlinear, field, monitor, norm 5702db13446SMatthew G. Knepley .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault(), SNESMonitorDefaultShort() 5712db13446SMatthew G. Knepley @*/ 572*d43b4f6eSBarry Smith PetscErrorCode SNESMonitorDefaultField(SNES snes, PetscInt its, PetscReal fgnorm, PetscViewerAndFormat *vf) 5732db13446SMatthew G. Knepley { 574*d43b4f6eSBarry Smith PetscViewer viewer = vf->viewer; 5752db13446SMatthew G. Knepley Vec r; 5762db13446SMatthew G. Knepley DM dm; 5772db13446SMatthew G. Knepley PetscReal res[256]; 5782db13446SMatthew G. Knepley PetscInt tablevel; 5792db13446SMatthew G. Knepley PetscErrorCode ierr; 5802db13446SMatthew G. Knepley 5812db13446SMatthew G. Knepley PetscFunctionBegin; 5824d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 5832db13446SMatthew G. Knepley ierr = SNESGetFunction(snes, &r, NULL, NULL);CHKERRQ(ierr); 5842db13446SMatthew G. Knepley ierr = VecGetDM(r, &dm);CHKERRQ(ierr); 585*d43b4f6eSBarry Smith if (!dm) {ierr = SNESMonitorDefault(snes, its, fgnorm, vf);CHKERRQ(ierr);} 5862db13446SMatthew G. Knepley else { 5872db13446SMatthew G. Knepley PetscSection s, gs; 5882db13446SMatthew G. Knepley PetscInt Nf, f; 5892db13446SMatthew G. Knepley 5902db13446SMatthew G. Knepley ierr = DMGetDefaultSection(dm, &s);CHKERRQ(ierr); 5912db13446SMatthew G. Knepley ierr = DMGetDefaultGlobalSection(dm, &gs);CHKERRQ(ierr); 592*d43b4f6eSBarry Smith if (!s || !gs) {ierr = SNESMonitorDefault(snes, its, fgnorm, vf);CHKERRQ(ierr);} 5932db13446SMatthew G. Knepley ierr = PetscSectionGetNumFields(s, &Nf);CHKERRQ(ierr); 5942db13446SMatthew G. Knepley if (Nf > 256) SETERRQ1(PetscObjectComm((PetscObject) snes), PETSC_ERR_SUP, "Do not support %d fields > 256", Nf); 5952db13446SMatthew G. Knepley ierr = PetscSectionVecNorm(s, gs, r, NORM_2, res);CHKERRQ(ierr); 5962db13446SMatthew G. Knepley ierr = PetscObjectGetTabLevel((PetscObject) snes, &tablevel);CHKERRQ(ierr); 597*d43b4f6eSBarry Smith ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr); 5982db13446SMatthew G. Knepley ierr = PetscViewerASCIIAddTab(viewer, tablevel);CHKERRQ(ierr); 5992db13446SMatthew G. Knepley ierr = PetscViewerASCIIPrintf(viewer, "%3D SNES Function norm %14.12e [", its, (double) fgnorm);CHKERRQ(ierr); 6002db13446SMatthew G. Knepley for (f = 0; f < Nf; ++f) { 6012db13446SMatthew G. Knepley if (f) {ierr = PetscViewerASCIIPrintf(viewer, ", ");CHKERRQ(ierr);} 6022db13446SMatthew G. Knepley ierr = PetscViewerASCIIPrintf(viewer, "%14.12e", res[f]);CHKERRQ(ierr); 6032db13446SMatthew G. Knepley } 6042db13446SMatthew G. Knepley ierr = PetscViewerASCIIPrintf(viewer, "] \n");CHKERRQ(ierr); 6052db13446SMatthew G. Knepley ierr = PetscViewerASCIISubtractTab(viewer, tablevel);CHKERRQ(ierr); 606*d43b4f6eSBarry Smith ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 6072db13446SMatthew G. Knepley } 6082db13446SMatthew G. Knepley PetscFunctionReturn(0); 6092db13446SMatthew G. Knepley } 610e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */ 6114a2ae208SSatish Balay #undef __FUNCT__ 6128d359177SBarry Smith #define __FUNCT__ "SNESConvergedDefault" 6134b828684SBarry Smith /*@C 6148d359177SBarry Smith SNESConvergedDefault - Convergence test of the solvers for 615f525115eSLois Curfman McInnes systems of nonlinear equations (default). 616e7e93795SLois Curfman McInnes 617c7afd0dbSLois Curfman McInnes Collective on SNES 618c7afd0dbSLois Curfman McInnes 619e7e93795SLois Curfman McInnes Input Parameters: 620c7afd0dbSLois Curfman McInnes + snes - the SNES context 62106ee9f85SBarry Smith . it - the iteration (0 indicates before any Newton steps) 622e7e93795SLois Curfman McInnes . xnorm - 2-norm of current iterate 623c60f73f4SPeter Brune . snorm - 2-norm of current step 6247f3332b4SBarry Smith . fnorm - 2-norm of function at current iterate 625c7afd0dbSLois Curfman McInnes - dummy - unused context 626e7e93795SLois Curfman McInnes 627184914b5SBarry Smith Output Parameter: 628184914b5SBarry Smith . reason - one of 62970441072SBarry Smith $ SNES_CONVERGED_FNORM_ABS - (fnorm < abstol), 630c60f73f4SPeter Brune $ SNES_CONVERGED_SNORM_RELATIVE - (snorm < stol*xnorm), 631184914b5SBarry Smith $ SNES_CONVERGED_FNORM_RELATIVE - (fnorm < rtol*fnorm0), 632184914b5SBarry Smith $ SNES_DIVERGED_FUNCTION_COUNT - (nfct > maxf), 633184914b5SBarry Smith $ SNES_DIVERGED_FNORM_NAN - (fnorm == NaN), 634184914b5SBarry Smith $ SNES_CONVERGED_ITERATING - (otherwise), 635e7e93795SLois Curfman McInnes 636e7e93795SLois Curfman McInnes where 637c7afd0dbSLois Curfman McInnes + maxf - maximum number of function evaluations, 638c7afd0dbSLois Curfman McInnes set with SNESSetTolerances() 639c7afd0dbSLois Curfman McInnes . nfct - number of function evaluations, 64070441072SBarry Smith . abstol - absolute function norm tolerance, 641c7afd0dbSLois Curfman McInnes set with SNESSetTolerances() 642c7afd0dbSLois Curfman McInnes - rtol - relative function norm tolerance, set with SNESSetTolerances() 643fee21e36SBarry Smith 64436851e7fSLois Curfman McInnes Level: intermediate 64536851e7fSLois Curfman McInnes 646e7e93795SLois Curfman McInnes .keywords: SNES, nonlinear, default, converged, convergence 647e7e93795SLois Curfman McInnes 64871f87433Sdalcinl .seealso: SNESSetConvergenceTest() 649e7e93795SLois Curfman McInnes @*/ 6508d359177SBarry Smith PetscErrorCode SNESConvergedDefault(SNES snes,PetscInt it,PetscReal xnorm,PetscReal snorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy) 651e7e93795SLois Curfman McInnes { 65263ba0a88SBarry Smith PetscErrorCode ierr; 65363ba0a88SBarry Smith 6543a40ed3dSBarry Smith PetscFunctionBegin; 6550700a824SBarry Smith PetscValidHeaderSpecific(snes,SNES_CLASSID,1); 6563f149594SLisandro Dalcin PetscValidPointer(reason,6); 6573f149594SLisandro Dalcin 65806ee9f85SBarry Smith *reason = SNES_CONVERGED_ITERATING; 65906ee9f85SBarry Smith 66006ee9f85SBarry Smith if (!it) { 66106ee9f85SBarry Smith /* set parameter for default relative tolerance convergence test */ 66206ee9f85SBarry Smith snes->ttol = fnorm*snes->rtol; 66306ee9f85SBarry Smith } 6648146f6ebSBarry Smith if (PetscIsInfOrNanReal(fnorm)) { 665ae15b995SBarry Smith ierr = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr); 666184914b5SBarry Smith *reason = SNES_DIVERGED_FNORM_NAN; 66770441072SBarry Smith } else if (fnorm < snes->abstol) { 6688f1a2a5eSBarry Smith ierr = PetscInfo2(snes,"Converged due to function norm %14.12e < %14.12e\n",(double)fnorm,(double)snes->abstol);CHKERRQ(ierr); 669184914b5SBarry Smith *reason = SNES_CONVERGED_FNORM_ABS; 67043e71028SBarry Smith } else if (snes->nfuncs >= snes->max_funcs) { 671ae15b995SBarry Smith ierr = PetscInfo2(snes,"Exceeded maximum number of function evaluations: %D > %D\n",snes->nfuncs,snes->max_funcs);CHKERRQ(ierr); 672184914b5SBarry Smith *reason = SNES_DIVERGED_FUNCTION_COUNT; 67306ee9f85SBarry Smith } 67406ee9f85SBarry Smith 67506ee9f85SBarry Smith if (it && !*reason) { 67606ee9f85SBarry Smith if (fnorm <= snes->ttol) { 6778f1a2a5eSBarry Smith ierr = PetscInfo2(snes,"Converged due to function norm %14.12e < %14.12e (relative tolerance)\n",(double)fnorm,(double)snes->ttol);CHKERRQ(ierr); 67806ee9f85SBarry Smith *reason = SNES_CONVERGED_FNORM_RELATIVE; 679c60f73f4SPeter Brune } else if (snorm < snes->stol*xnorm) { 680c60f73f4SPeter 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); 681c60f73f4SPeter Brune *reason = SNES_CONVERGED_SNORM_RELATIVE; 68206ee9f85SBarry Smith } 683e7e93795SLois Curfman McInnes } 6843a40ed3dSBarry Smith PetscFunctionReturn(0); 685e7e93795SLois Curfman McInnes } 6863f149594SLisandro Dalcin 6873f149594SLisandro Dalcin #undef __FUNCT__ 688e2a6519dSDmitry Karpeev #define __FUNCT__ "SNESConvergedSkip" 6893f149594SLisandro Dalcin /*@C 690e2a6519dSDmitry Karpeev SNESConvergedSkip - Convergence test for SNES that NEVER returns as 6913f149594SLisandro Dalcin converged, UNLESS the maximum number of iteration have been reached. 6923f149594SLisandro Dalcin 6933f9fe445SBarry Smith Logically Collective on SNES 6943f149594SLisandro Dalcin 6953f149594SLisandro Dalcin Input Parameters: 6963f149594SLisandro Dalcin + snes - the SNES context 6973f149594SLisandro Dalcin . it - the iteration (0 indicates before any Newton steps) 6983f149594SLisandro Dalcin . xnorm - 2-norm of current iterate 699c60f73f4SPeter Brune . snorm - 2-norm of current step 7003f149594SLisandro Dalcin . fnorm - 2-norm of function at current iterate 7013f149594SLisandro Dalcin - dummy - unused context 7023f149594SLisandro Dalcin 7033f149594SLisandro Dalcin Output Parameter: 70485385478SLisandro Dalcin . reason - SNES_CONVERGED_ITERATING, SNES_CONVERGED_ITS, or SNES_DIVERGED_FNORM_NAN 7053f149594SLisandro Dalcin 7063f149594SLisandro Dalcin Notes: 7073f149594SLisandro Dalcin Convergence is then declared after a fixed number of iterations have been used. 7083f149594SLisandro Dalcin 7093f149594SLisandro Dalcin Level: advanced 7103f149594SLisandro Dalcin 7113f149594SLisandro Dalcin .keywords: SNES, nonlinear, skip, converged, convergence 7123f149594SLisandro Dalcin 7133f149594SLisandro Dalcin .seealso: SNESSetConvergenceTest() 7143f149594SLisandro Dalcin @*/ 715e2a6519dSDmitry Karpeev PetscErrorCode SNESConvergedSkip(SNES snes,PetscInt it,PetscReal xnorm,PetscReal snorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy) 7163f149594SLisandro Dalcin { 7173f149594SLisandro Dalcin PetscErrorCode ierr; 7183f149594SLisandro Dalcin 7193f149594SLisandro Dalcin PetscFunctionBegin; 7200700a824SBarry Smith PetscValidHeaderSpecific(snes,SNES_CLASSID,1); 7213f149594SLisandro Dalcin PetscValidPointer(reason,6); 7223f149594SLisandro Dalcin 7233f149594SLisandro Dalcin *reason = SNES_CONVERGED_ITERATING; 7243f149594SLisandro Dalcin 7253f149594SLisandro Dalcin if (fnorm != fnorm) { 7263f149594SLisandro Dalcin ierr = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr); 7273f149594SLisandro Dalcin *reason = SNES_DIVERGED_FNORM_NAN; 7283f149594SLisandro Dalcin } else if (it == snes->max_its) { 7293f149594SLisandro Dalcin *reason = SNES_CONVERGED_ITS; 7303f149594SLisandro Dalcin } 7313f149594SLisandro Dalcin PetscFunctionReturn(0); 7323f149594SLisandro Dalcin } 7333f149594SLisandro Dalcin 73458c9b817SLisandro Dalcin #undef __FUNCT__ 735fa0ddf94SBarry Smith #define __FUNCT__ "SNESSetWorkVecs" 7368d359177SBarry Smith /*@C 737fa0ddf94SBarry Smith SNESSetWorkVecs - Gets a number of work vectors. 73858c9b817SLisandro Dalcin 73958c9b817SLisandro Dalcin Input Parameters: 74058c9b817SLisandro Dalcin . snes - the SNES context 74158c9b817SLisandro Dalcin . nw - number of work vectors to allocate 74258c9b817SLisandro Dalcin 74358c9b817SLisandro Dalcin Level: developer 74458c9b817SLisandro Dalcin 745fa0ddf94SBarry Smith Developers Note: This is PETSC_EXTERN because it may be used by user written plugin SNES implementations 746fa0ddf94SBarry Smith 74798acb6afSMatthew G Knepley @*/ 748fa0ddf94SBarry Smith PetscErrorCode SNESSetWorkVecs(SNES snes,PetscInt nw) 74958c9b817SLisandro Dalcin { 750c5ed8070SMatthew G. Knepley DM dm; 751c5ed8070SMatthew G. Knepley Vec v; 75258c9b817SLisandro Dalcin PetscErrorCode ierr; 75358c9b817SLisandro Dalcin 75458c9b817SLisandro Dalcin PetscFunctionBegin; 75558c9b817SLisandro Dalcin if (snes->work) {ierr = VecDestroyVecs(snes->nwork,&snes->work);CHKERRQ(ierr);} 75658c9b817SLisandro Dalcin snes->nwork = nw; 757f5af7f23SKarl Rupp 758c5ed8070SMatthew G. Knepley ierr = SNESGetDM(snes, &dm);CHKERRQ(ierr); 759c5ed8070SMatthew G. Knepley ierr = DMGetGlobalVector(dm, &v);CHKERRQ(ierr); 760c5ed8070SMatthew G. Knepley ierr = VecDuplicateVecs(v,snes->nwork,&snes->work);CHKERRQ(ierr); 761c5ed8070SMatthew G. Knepley ierr = DMRestoreGlobalVector(dm, &v);CHKERRQ(ierr); 76258c9b817SLisandro Dalcin ierr = PetscLogObjectParents(snes,nw,snes->work);CHKERRQ(ierr); 76358c9b817SLisandro Dalcin PetscFunctionReturn(0); 76458c9b817SLisandro Dalcin } 765