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 @*/ 267087cfbeSBarry Smith PetscErrorCode SNESMonitorSolution(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy) 273f1db9ecSBarry Smith { 28dfbe8321SBarry Smith PetscErrorCode ierr; 293f1db9ecSBarry Smith Vec x; 30b0a32e0cSBarry Smith PetscViewer viewer = (PetscViewer) dummy; 313f1db9ecSBarry Smith 323f1db9ecSBarry Smith PetscFunctionBegin; 334d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 343f1db9ecSBarry Smith ierr = SNESGetSolution(snes,&x);CHKERRQ(ierr); 353f1db9ecSBarry Smith ierr = VecView(x,viewer);CHKERRQ(ierr); 363f1db9ecSBarry Smith PetscFunctionReturn(0); 373f1db9ecSBarry Smith } 383f1db9ecSBarry Smith 394a2ae208SSatish Balay #undef __FUNCT__ 40a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorResidual" 415ed2d596SBarry Smith /*@C 42a6570f20SBarry Smith SNESMonitorResidual - Monitors progress of the SNES solvers by calling 435ed2d596SBarry Smith VecView() for the residual at each iteration. 445ed2d596SBarry Smith 455ed2d596SBarry Smith Collective on SNES 465ed2d596SBarry Smith 475ed2d596SBarry Smith Input Parameters: 485ed2d596SBarry Smith + snes - the SNES context 495ed2d596SBarry Smith . its - iteration number 504b27c08aSLois Curfman McInnes . fgnorm - 2-norm of residual 51f55353a2SBarry Smith - dummy - a viewer 525ed2d596SBarry Smith 535ed2d596SBarry Smith Level: intermediate 545ed2d596SBarry Smith 555ed2d596SBarry Smith .keywords: SNES, nonlinear, vector, monitor, view 565ed2d596SBarry Smith 57a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView() 585ed2d596SBarry Smith @*/ 597087cfbeSBarry Smith PetscErrorCode SNESMonitorResidual(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy) 605ed2d596SBarry Smith { 61dfbe8321SBarry Smith PetscErrorCode ierr; 625ed2d596SBarry Smith Vec x; 635ed2d596SBarry Smith PetscViewer viewer = (PetscViewer) dummy; 645ed2d596SBarry Smith 655ed2d596SBarry Smith PetscFunctionBegin; 664d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 675ed2d596SBarry Smith ierr = SNESGetFunction(snes,&x,0,0);CHKERRQ(ierr); 685ed2d596SBarry Smith ierr = VecView(x,viewer);CHKERRQ(ierr); 695ed2d596SBarry Smith PetscFunctionReturn(0); 705ed2d596SBarry Smith } 715ed2d596SBarry Smith 725ed2d596SBarry Smith #undef __FUNCT__ 73a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorSolutionUpdate" 74d132466eSBarry Smith /*@C 75a6570f20SBarry Smith SNESMonitorSolutionUpdate - Monitors progress of the SNES solvers by calling 76d132466eSBarry Smith VecView() for the UPDATE to the solution at each iteration. 77d132466eSBarry Smith 78d132466eSBarry Smith Collective on SNES 79d132466eSBarry Smith 80d132466eSBarry Smith Input Parameters: 81d132466eSBarry Smith + snes - the SNES context 82d132466eSBarry Smith . its - iteration number 834b27c08aSLois Curfman McInnes . fgnorm - 2-norm of residual 84f55353a2SBarry Smith - dummy - a viewer 85d132466eSBarry Smith 86d132466eSBarry Smith Level: intermediate 87d132466eSBarry Smith 88d132466eSBarry Smith .keywords: SNES, nonlinear, vector, monitor, view 89d132466eSBarry Smith 90a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), VecView() 91d132466eSBarry Smith @*/ 927087cfbeSBarry Smith PetscErrorCode SNESMonitorSolutionUpdate(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy) 93d132466eSBarry Smith { 94dfbe8321SBarry Smith PetscErrorCode ierr; 95d132466eSBarry Smith Vec x; 96b0a32e0cSBarry Smith PetscViewer viewer = (PetscViewer) dummy; 97d132466eSBarry Smith 98d132466eSBarry Smith PetscFunctionBegin; 994d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 100d132466eSBarry Smith ierr = SNESGetSolutionUpdate(snes,&x);CHKERRQ(ierr); 101d132466eSBarry Smith ierr = VecView(x,viewer);CHKERRQ(ierr); 102d132466eSBarry Smith PetscFunctionReturn(0); 103d132466eSBarry Smith } 104d132466eSBarry Smith 1054a2ae208SSatish Balay #undef __FUNCT__ 106a5c2985bSBarry Smith #define __FUNCT__ "KSPMonitorSNES" 107a5c2985bSBarry Smith /*@C 108a5c2985bSBarry Smith KSPMonitorSNES - Print the residual norm of the nonlinear function at each iteration of the linear iterative solver. 109a5c2985bSBarry Smith 110a5c2985bSBarry Smith Collective on KSP 111a5c2985bSBarry Smith 112a5c2985bSBarry Smith Input Parameters: 113a5c2985bSBarry Smith + ksp - iterative context 114a5c2985bSBarry Smith . n - iteration number 115a5c2985bSBarry Smith . rnorm - 2-norm (preconditioned) residual value (may be estimated). 116a5c2985bSBarry Smith - dummy - unused monitor context 117a5c2985bSBarry Smith 118a5c2985bSBarry Smith Level: intermediate 119a5c2985bSBarry Smith 120a5c2985bSBarry Smith .keywords: KSP, default, monitor, residual 121a5c2985bSBarry Smith 122a5c2985bSBarry Smith .seealso: KSPMonitorSet(), KSPMonitorTrueResidualNorm(), KSPMonitorLGResidualNormCreate() 123a5c2985bSBarry Smith @*/ 124a5c2985bSBarry Smith PetscErrorCode KSPMonitorSNES(KSP ksp,PetscInt n,PetscReal rnorm,void *dummy) 125a5c2985bSBarry Smith { 126a5c2985bSBarry Smith PetscErrorCode ierr; 127a5c2985bSBarry Smith PetscViewer viewer; 128a5c2985bSBarry Smith SNES snes = (SNES) dummy; 129a5c2985bSBarry Smith Vec snes_solution,work1,work2; 130a5c2985bSBarry Smith PetscReal snorm; 131a5c2985bSBarry Smith 132a5c2985bSBarry Smith PetscFunctionBegin; 133a5c2985bSBarry Smith ierr = SNESGetSolution(snes,&snes_solution);CHKERRQ(ierr); 134a5c2985bSBarry Smith ierr = VecDuplicate(snes_solution,&work1);CHKERRQ(ierr); 135a5c2985bSBarry Smith ierr = VecDuplicate(snes_solution,&work2);CHKERRQ(ierr); 136a5c2985bSBarry Smith ierr = KSPBuildSolution(ksp,work1,NULL);CHKERRQ(ierr); 137a5c2985bSBarry Smith ierr = VecAYPX(work1,-1.0,snes_solution);CHKERRQ(ierr); 138a5c2985bSBarry Smith ierr = SNESComputeFunction(snes,work1,work2);CHKERRQ(ierr); 139a5c2985bSBarry Smith ierr = VecNorm(work2,NORM_2,&snorm);CHKERRQ(ierr); 140a5c2985bSBarry Smith ierr = VecDestroy(&work1);CHKERRQ(ierr); 141a5c2985bSBarry Smith ierr = VecDestroy(&work2);CHKERRQ(ierr); 142a5c2985bSBarry Smith 143a5c2985bSBarry Smith ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ksp),&viewer);CHKERRQ(ierr); 144a5c2985bSBarry Smith ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr); 145a5c2985bSBarry Smith if (n == 0 && ((PetscObject)ksp)->prefix) { 146a5c2985bSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Residual norms for %s solve.\n",((PetscObject)ksp)->prefix);CHKERRQ(ierr); 147a5c2985bSBarry Smith } 148a5c2985bSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Residual norm %5.3e KSP Residual norm %5.3e \n",n,(double)snorm,(double)rnorm);CHKERRQ(ierr); 149a5c2985bSBarry Smith ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr); 150a5c2985bSBarry Smith PetscFunctionReturn(0); 151a5c2985bSBarry Smith } 152a5c2985bSBarry Smith 153e5f7ee39SBarry Smith #include <petscdraw.h> 154e5f7ee39SBarry Smith 155e5f7ee39SBarry Smith #undef __FUNCT__ 156e5f7ee39SBarry Smith #define __FUNCT__ "KSPMonitorSNESLGResidualNormCreate" 157e5f7ee39SBarry Smith /*@C 158e5f7ee39SBarry Smith KSPMonitorSNESLGResidualNormCreate - Creates a line graph context for use with 159e5f7ee39SBarry Smith KSP to monitor convergence of preconditioned residual norms. 160e5f7ee39SBarry Smith 161e5f7ee39SBarry Smith Collective on KSP 162e5f7ee39SBarry Smith 163e5f7ee39SBarry Smith Input Parameters: 164*8b0b5a47SLisandro Dalcin + comm - communicator context 165*8b0b5a47SLisandro Dalcin . host - the X display to open, or null for the local machine 166e5f7ee39SBarry Smith . label - the title to put in the title bar 167e5f7ee39SBarry Smith . x, y - the screen coordinates of the upper left coordinate of 168e5f7ee39SBarry Smith the window 169e5f7ee39SBarry Smith - m, n - the screen width and height in pixels 170e5f7ee39SBarry Smith 171e5f7ee39SBarry Smith Output Parameter: 172e5f7ee39SBarry Smith . draw - the drawing context 173e5f7ee39SBarry Smith 174e5f7ee39SBarry Smith Options Database Key: 175e5f7ee39SBarry Smith . -ksp_monitor_lg_residualnorm - Sets line graph monitor 176e5f7ee39SBarry Smith 177e5f7ee39SBarry Smith Notes: 178e5f7ee39SBarry Smith Use KSPMonitorSNESLGResidualNormDestroy() to destroy this line graph; do not use PetscDrawLGDestroy(). 179e5f7ee39SBarry Smith 180e5f7ee39SBarry Smith Level: intermediate 181e5f7ee39SBarry Smith 182e5f7ee39SBarry Smith .keywords: KSP, monitor, line graph, residual, create 183e5f7ee39SBarry Smith 184e5f7ee39SBarry Smith .seealso: KSPMonitorSNESLGResidualNormDestroy(), KSPMonitorSet(), KSPMonitorSNESLGTrueResidualCreate() 185e5f7ee39SBarry Smith @*/ 186*8b0b5a47SLisandro Dalcin PetscErrorCode KSPMonitorSNESLGResidualNormCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscObject **objs) 187e5f7ee39SBarry Smith { 188e5f7ee39SBarry Smith PetscDraw draw; 189e5f7ee39SBarry Smith PetscErrorCode ierr; 190e5f7ee39SBarry Smith PetscDrawAxis axis; 191e5f7ee39SBarry Smith PetscDrawLG drawlg; 192e5f7ee39SBarry Smith const char *names[] = {"Linear residual","Nonlinear residual"}; 193e5f7ee39SBarry Smith 194e5f7ee39SBarry Smith PetscFunctionBegin; 195*8b0b5a47SLisandro Dalcin ierr = PetscDrawCreate(comm,host,label,x,y,m,n,&draw);CHKERRQ(ierr); 196e5f7ee39SBarry Smith ierr = PetscDrawSetFromOptions(draw);CHKERRQ(ierr); 197e5f7ee39SBarry Smith ierr = PetscDrawLGCreate(draw,2,&drawlg);CHKERRQ(ierr); 198*8b0b5a47SLisandro Dalcin ierr = PetscDrawLGSetLegend(drawlg,names);CHKERRQ(ierr); 199957f8de3SLisandro Dalcin ierr = PetscDrawLGSetFromOptions(drawlg);CHKERRQ(ierr); 200e5f7ee39SBarry Smith ierr = PetscDrawLGGetAxis(drawlg,&axis);CHKERRQ(ierr); 201e5f7ee39SBarry Smith ierr = PetscDrawAxisSetLabels(axis,"Convergence of Residual Norm","Iteration","Residual Norm");CHKERRQ(ierr); 202e5f7ee39SBarry Smith ierr = PetscLogObjectParent((PetscObject)drawlg,(PetscObject)draw);CHKERRQ(ierr); 203e5f7ee39SBarry Smith 204435c5a64SBarry Smith ierr = PetscMalloc1(3,objs);CHKERRQ(ierr); 205e5f7ee39SBarry Smith (*objs)[1] = (PetscObject)drawlg; 206435c5a64SBarry Smith (*objs)[2] = (PetscObject)draw; 207e5f7ee39SBarry Smith PetscFunctionReturn(0); 208e5f7ee39SBarry Smith } 209e5f7ee39SBarry Smith 210e5f7ee39SBarry Smith #undef __FUNCT__ 211e5f7ee39SBarry Smith #define __FUNCT__ "KSPMonitorSNESLGResidualNorm" 212e5f7ee39SBarry Smith PetscErrorCode KSPMonitorSNESLGResidualNorm(KSP ksp,PetscInt n,PetscReal rnorm,PetscObject *objs) 213e5f7ee39SBarry Smith { 214e5f7ee39SBarry Smith PetscDrawLG lg = (PetscDrawLG) objs[1]; 215e5f7ee39SBarry Smith PetscErrorCode ierr; 216e5f7ee39SBarry Smith PetscReal y[2]; 217e5f7ee39SBarry Smith SNES snes = (SNES) objs[0]; 218e5f7ee39SBarry Smith Vec snes_solution,work1,work2; 219e5f7ee39SBarry Smith 220e5f7ee39SBarry Smith PetscFunctionBegin; 221e5f7ee39SBarry Smith if (rnorm > 0.0) y[0] = PetscLog10Real(rnorm); 222e5f7ee39SBarry Smith else y[0] = -15.0; 223e5f7ee39SBarry Smith 224e5f7ee39SBarry Smith ierr = SNESGetSolution(snes,&snes_solution);CHKERRQ(ierr); 225e5f7ee39SBarry Smith ierr = VecDuplicate(snes_solution,&work1);CHKERRQ(ierr); 226e5f7ee39SBarry Smith ierr = VecDuplicate(snes_solution,&work2);CHKERRQ(ierr); 227e5f7ee39SBarry Smith ierr = KSPBuildSolution(ksp,work1,NULL);CHKERRQ(ierr); 228e5f7ee39SBarry Smith ierr = VecAYPX(work1,-1.0,snes_solution);CHKERRQ(ierr); 229e5f7ee39SBarry Smith ierr = SNESComputeFunction(snes,work1,work2);CHKERRQ(ierr); 230e5f7ee39SBarry Smith ierr = VecNorm(work2,NORM_2,y+1);CHKERRQ(ierr); 231e5f7ee39SBarry Smith if (y[1] > 0.0) y[1] = PetscLog10Real(y[1]); 232e5f7ee39SBarry Smith else y[1] = -15.0; 233e5f7ee39SBarry Smith ierr = VecDestroy(&work1);CHKERRQ(ierr); 234e5f7ee39SBarry Smith ierr = VecDestroy(&work2);CHKERRQ(ierr); 235e5f7ee39SBarry Smith 236e5f7ee39SBarry Smith ierr = PetscDrawLGAddPoint(lg,NULL,y);CHKERRQ(ierr); 237e5f7ee39SBarry Smith if (n < 20 || !(n % 5)) { 238e5f7ee39SBarry Smith ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr); 239e5f7ee39SBarry Smith } 240e5f7ee39SBarry Smith PetscFunctionReturn(0); 241e5f7ee39SBarry Smith } 242e5f7ee39SBarry Smith 243e5f7ee39SBarry Smith #undef __FUNCT__ 244e5f7ee39SBarry Smith #define __FUNCT__ "KSPMonitorSNESLGResidualNormDestroy" 245e5f7ee39SBarry Smith /*@ 246e5f7ee39SBarry Smith KSPMonitorSNESLGResidualNormDestroy - Destroys a line graph context that was created 247e5f7ee39SBarry Smith with KSPMonitorSNESLGResidualNormCreate(). 248e5f7ee39SBarry Smith 249e5f7ee39SBarry Smith Collective on KSP 250e5f7ee39SBarry Smith 251e5f7ee39SBarry Smith Input Parameter: 252e5f7ee39SBarry Smith . draw - the drawing context 253e5f7ee39SBarry Smith 254e5f7ee39SBarry Smith Level: intermediate 255e5f7ee39SBarry Smith 256e5f7ee39SBarry Smith .keywords: KSP, monitor, line graph, destroy 257e5f7ee39SBarry Smith 258e5f7ee39SBarry Smith .seealso: KSPMonitorSNESLGResidualNormCreate(), KSPMonitorSNESLGTrueResidualDestroy(), KSPMonitorSet() 259e5f7ee39SBarry Smith @*/ 260e5f7ee39SBarry Smith PetscErrorCode KSPMonitorSNESLGResidualNormDestroy(PetscObject **objs) 261e5f7ee39SBarry Smith { 262e5f7ee39SBarry Smith PetscErrorCode ierr; 263e5f7ee39SBarry Smith PetscDrawLG drawlg = (PetscDrawLG) (*objs)[1]; 264435c5a64SBarry Smith PetscDraw draw = (PetscDraw) (*objs)[2]; 265e5f7ee39SBarry Smith 266e5f7ee39SBarry Smith PetscFunctionBegin; 267e5f7ee39SBarry Smith ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr); 268e5f7ee39SBarry Smith ierr = PetscDrawLGDestroy(&drawlg);CHKERRQ(ierr); 269e5f7ee39SBarry Smith ierr = PetscFree(*objs);CHKERRQ(ierr); 270e5f7ee39SBarry Smith PetscFunctionReturn(0); 271e5f7ee39SBarry Smith } 272e5f7ee39SBarry Smith 273a5c2985bSBarry Smith #undef __FUNCT__ 274a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorDefault" 2754b828684SBarry Smith /*@C 276a6570f20SBarry Smith SNESMonitorDefault - Monitors progress of the SNES solvers (default). 277e7e93795SLois Curfman McInnes 278c7afd0dbSLois Curfman McInnes Collective on SNES 279c7afd0dbSLois Curfman McInnes 280e7e93795SLois Curfman McInnes Input Parameters: 281c7afd0dbSLois Curfman McInnes + snes - the SNES context 282e7e93795SLois Curfman McInnes . its - iteration number 2834b27c08aSLois Curfman McInnes . fgnorm - 2-norm of residual 284c7afd0dbSLois Curfman McInnes - dummy - unused context 285fee21e36SBarry Smith 286e7e93795SLois Curfman McInnes Notes: 2874b27c08aSLois Curfman McInnes This routine prints the residual norm at each iteration. 288e7e93795SLois Curfman McInnes 28936851e7fSLois Curfman McInnes Level: intermediate 29036851e7fSLois Curfman McInnes 291e7e93795SLois Curfman McInnes .keywords: SNES, nonlinear, default, monitor, norm 292e7e93795SLois Curfman McInnes 293a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution() 294e7e93795SLois Curfman McInnes @*/ 2957087cfbeSBarry Smith PetscErrorCode SNESMonitorDefault(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy) 296e7e93795SLois Curfman McInnes { 297dfbe8321SBarry Smith PetscErrorCode ierr; 2984d4332d5SBarry Smith PetscViewer viewer = (PetscViewer) dummy; 299d132466eSBarry Smith 3003a40ed3dSBarry Smith PetscFunctionBegin; 3014d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 302649052a6SBarry Smith ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 303649052a6SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %14.12e \n",its,(double)fgnorm);CHKERRQ(ierr); 304649052a6SBarry Smith ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 3053a40ed3dSBarry Smith PetscFunctionReturn(0); 306e7e93795SLois Curfman McInnes } 3073f1db9ecSBarry Smith 308b271bb04SBarry Smith #undef __FUNCT__ 3092e7541e6SPeter Brune #define __FUNCT__ "SNESMonitorJacUpdateSpectrum" 310a80ad3e0SBarry Smith PetscErrorCode SNESMonitorJacUpdateSpectrum(SNES snes,PetscInt it,PetscReal fnorm,void *ctx) 311a80ad3e0SBarry Smith { 312196da8b6SPeter Brune #if defined(PETSC_MISSING_LAPACK_GEEV) 313ce94432eSBarry Smith SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_SUP,"GEEV - Lapack routine is unavailable\nNot able to provide eigen values."); 314196da8b6SPeter Brune #elif defined(PETSC_HAVE_ESSL) 315ce94432eSBarry Smith SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_SUP,"GEEV - No support for ESSL Lapack Routines"); 316196da8b6SPeter Brune #else 3172e7541e6SPeter Brune Vec X; 3182e7541e6SPeter Brune Mat J,dJ,dJdense; 3192e7541e6SPeter Brune PetscErrorCode ierr; 320d1e9a80fSBarry Smith PetscErrorCode (*func)(SNES,Vec,Mat,Mat,void*); 3212e7541e6SPeter Brune PetscInt n,i; 3222e7541e6SPeter Brune PetscBLASInt nb,lwork; 3232e7541e6SPeter Brune PetscReal *eigr,*eigi; 3242e7541e6SPeter Brune PetscScalar *work; 3252e7541e6SPeter Brune PetscScalar *a; 3262e7541e6SPeter Brune 3272e7541e6SPeter Brune PetscFunctionBegin; 3282e7541e6SPeter Brune if (it == 0) PetscFunctionReturn(0); 3292e7541e6SPeter Brune /* create the difference between the current update and the current jacobian */ 3302e7541e6SPeter Brune ierr = SNESGetSolution(snes,&X);CHKERRQ(ierr); 331d1e9a80fSBarry Smith ierr = SNESGetJacobian(snes,NULL,&J,&func,NULL);CHKERRQ(ierr); 3322e7541e6SPeter Brune ierr = MatDuplicate(J,MAT_COPY_VALUES,&dJ);CHKERRQ(ierr); 333d1e9a80fSBarry Smith ierr = SNESComputeJacobian(snes,X,dJ,dJ);CHKERRQ(ierr); 3342e7541e6SPeter Brune ierr = MatAXPY(dJ,-1.0,J,SAME_NONZERO_PATTERN);CHKERRQ(ierr); 335f5af7f23SKarl Rupp 3362e7541e6SPeter Brune /* compute the spectrum directly */ 3372e7541e6SPeter Brune ierr = MatConvert(dJ,MATSEQDENSE,MAT_INITIAL_MATRIX,&dJdense);CHKERRQ(ierr); 3380298fd71SBarry Smith ierr = MatGetSize(dJ,&n,NULL);CHKERRQ(ierr); 339c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nb);CHKERRQ(ierr); 3402e7541e6SPeter Brune lwork = 3*nb; 341785e854fSJed Brown ierr = PetscMalloc1(n,&eigr);CHKERRQ(ierr); 342785e854fSJed Brown ierr = PetscMalloc1(n,&eigi);CHKERRQ(ierr); 343785e854fSJed Brown ierr = PetscMalloc1(lwork,&work);CHKERRQ(ierr); 3448c778c55SBarry Smith ierr = MatDenseGetArray(dJdense,&a);CHKERRQ(ierr); 3452e7541e6SPeter Brune #if !defined(PETSC_USE_COMPLEX) 3462e7541e6SPeter Brune { 3472e7541e6SPeter Brune PetscBLASInt lierr; 3482e7541e6SPeter Brune ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 3498b83055fSJed Brown PetscStackCallBLAS("LAPACKgeev",LAPACKgeev_("N","N",&nb,a,&nb,eigr,eigi,NULL,&nb,NULL,&nb,work,&lwork,&lierr)); 3502e7541e6SPeter Brune if (lierr) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"geev() error %d",lierr); 3512e7541e6SPeter Brune ierr = PetscFPTrapPop();CHKERRQ(ierr); 3522e7541e6SPeter Brune } 3532e7541e6SPeter Brune #else 3542e7541e6SPeter Brune SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Not coded for complex"); 3552e7541e6SPeter Brune #endif 356ce94432eSBarry Smith PetscPrintf(PetscObjectComm((PetscObject)snes),"Eigenvalues of J_%d - J_%d:\n",it,it-1);CHKERRQ(ierr); 3572e7541e6SPeter Brune for (i=0;i<n;i++) { 3588fa295daSBarry Smith PetscPrintf(PetscObjectComm((PetscObject)snes),"%5d: %20.5g + %20.5gi\n",i,(double)eigr[i],(double)eigi[i]);CHKERRQ(ierr); 3592e7541e6SPeter Brune } 3608c778c55SBarry Smith ierr = MatDenseRestoreArray(dJdense,&a);CHKERRQ(ierr); 3612e7541e6SPeter Brune ierr = MatDestroy(&dJ);CHKERRQ(ierr); 3622e7541e6SPeter Brune ierr = MatDestroy(&dJdense);CHKERRQ(ierr); 3632e7541e6SPeter Brune ierr = PetscFree(eigr);CHKERRQ(ierr); 3642e7541e6SPeter Brune ierr = PetscFree(eigi);CHKERRQ(ierr); 3652e7541e6SPeter Brune ierr = PetscFree(work);CHKERRQ(ierr); 3662e7541e6SPeter Brune PetscFunctionReturn(0); 367196da8b6SPeter Brune #endif 3682e7541e6SPeter Brune } 3692e7541e6SPeter Brune 3702e7541e6SPeter Brune #undef __FUNCT__ 371b271bb04SBarry Smith #define __FUNCT__ "SNESMonitorRange_Private" 3727087cfbeSBarry Smith PetscErrorCode SNESMonitorRange_Private(SNES snes,PetscInt it,PetscReal *per) 373b271bb04SBarry Smith { 374b271bb04SBarry Smith PetscErrorCode ierr; 375b271bb04SBarry Smith Vec resid; 376b271bb04SBarry Smith PetscReal rmax,pwork; 377b271bb04SBarry Smith PetscInt i,n,N; 378b271bb04SBarry Smith PetscScalar *r; 379b271bb04SBarry Smith 380b271bb04SBarry Smith PetscFunctionBegin; 381b271bb04SBarry Smith ierr = SNESGetFunction(snes,&resid,0,0);CHKERRQ(ierr); 382b271bb04SBarry Smith ierr = VecNorm(resid,NORM_INFINITY,&rmax);CHKERRQ(ierr); 383b271bb04SBarry Smith ierr = VecGetLocalSize(resid,&n);CHKERRQ(ierr); 384b271bb04SBarry Smith ierr = VecGetSize(resid,&N);CHKERRQ(ierr); 385b271bb04SBarry Smith ierr = VecGetArray(resid,&r);CHKERRQ(ierr); 386b271bb04SBarry Smith pwork = 0.0; 387b271bb04SBarry Smith for (i=0; i<n; i++) { 388b271bb04SBarry Smith pwork += (PetscAbsScalar(r[i]) > .20*rmax); 389b271bb04SBarry Smith } 390ce94432eSBarry Smith ierr = MPI_Allreduce(&pwork,per,1,MPIU_REAL,MPIU_SUM,PetscObjectComm((PetscObject)snes));CHKERRQ(ierr); 391b271bb04SBarry Smith ierr = VecRestoreArray(resid,&r);CHKERRQ(ierr); 392b271bb04SBarry Smith *per = *per/N; 393b271bb04SBarry Smith PetscFunctionReturn(0); 394b271bb04SBarry Smith } 395b271bb04SBarry Smith 396b271bb04SBarry Smith #undef __FUNCT__ 397b271bb04SBarry Smith #define __FUNCT__ "SNESMonitorRange" 398b271bb04SBarry Smith /*@C 399b271bb04SBarry Smith SNESMonitorRange - Prints the percentage of residual elements that are more then 10 percent of the maximum value. 400b271bb04SBarry Smith 401b271bb04SBarry Smith Collective on SNES 402b271bb04SBarry Smith 403b271bb04SBarry Smith Input Parameters: 404b271bb04SBarry Smith + snes - iterative context 405b271bb04SBarry Smith . it - iteration number 406b271bb04SBarry Smith . rnorm - 2-norm (preconditioned) residual value (may be estimated). 407b271bb04SBarry Smith - dummy - unused monitor context 408b271bb04SBarry Smith 409b271bb04SBarry Smith Options Database Key: 410b271bb04SBarry Smith . -snes_monitor_range - Activates SNESMonitorRange() 411b271bb04SBarry Smith 412b271bb04SBarry Smith Level: intermediate 413b271bb04SBarry Smith 414b271bb04SBarry Smith .keywords: SNES, default, monitor, residual 415b271bb04SBarry Smith 416b271bb04SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorDefault(), SNESMonitorLGCreate() 417b271bb04SBarry Smith @*/ 4187087cfbeSBarry Smith PetscErrorCode SNESMonitorRange(SNES snes,PetscInt it,PetscReal rnorm,void *dummy) 419b271bb04SBarry Smith { 420b271bb04SBarry Smith PetscErrorCode ierr; 421b271bb04SBarry Smith PetscReal perc,rel; 4224d4332d5SBarry Smith PetscViewer viewer = (PetscViewer) dummy; 423b271bb04SBarry Smith /* should be in a MonitorRangeContext */ 424b271bb04SBarry Smith static PetscReal prev; 425b271bb04SBarry Smith 426b271bb04SBarry Smith PetscFunctionBegin; 4274d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 428b271bb04SBarry Smith if (!it) prev = rnorm; 429b271bb04SBarry Smith ierr = SNESMonitorRange_Private(snes,it,&perc);CHKERRQ(ierr); 430b271bb04SBarry Smith 431b271bb04SBarry Smith rel = (prev - rnorm)/prev; 432b271bb04SBarry Smith prev = rnorm; 433649052a6SBarry Smith ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 4346712e2f1SBarry 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); 435649052a6SBarry Smith ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 436b271bb04SBarry Smith PetscFunctionReturn(0); 437b271bb04SBarry Smith } 438b271bb04SBarry Smith 439eabae89aSBarry Smith typedef struct { 440649052a6SBarry Smith PetscViewer viewer; 441eabae89aSBarry Smith PetscReal *history; 442a6570f20SBarry Smith } SNESMonitorRatioContext; 443eabae89aSBarry Smith 4443a7fca6bSBarry Smith #undef __FUNCT__ 445a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorRatio" 4463a7fca6bSBarry Smith /*@C 447a6570f20SBarry Smith SNESMonitorRatio - Monitors progress of the SNES solvers by printing the ratio 4484b27c08aSLois Curfman McInnes of residual norm at each iteration to the previous. 4493a7fca6bSBarry Smith 4503a7fca6bSBarry Smith Collective on SNES 4513a7fca6bSBarry Smith 4523a7fca6bSBarry Smith Input Parameters: 4533a7fca6bSBarry Smith + snes - the SNES context 4543a7fca6bSBarry Smith . its - iteration number 4553a7fca6bSBarry Smith . fgnorm - 2-norm of residual (or gradient) 456eabae89aSBarry Smith - dummy - context of monitor 4573a7fca6bSBarry Smith 4583a7fca6bSBarry Smith Level: intermediate 4593a7fca6bSBarry Smith 4603a7fca6bSBarry Smith .keywords: SNES, nonlinear, monitor, norm 4613a7fca6bSBarry Smith 462a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution() 4633a7fca6bSBarry Smith @*/ 4647087cfbeSBarry Smith PetscErrorCode SNESMonitorRatio(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy) 4653a7fca6bSBarry Smith { 466dfbe8321SBarry Smith PetscErrorCode ierr; 46777431f27SBarry Smith PetscInt len; 46887828ca2SBarry Smith PetscReal *history; 469a6570f20SBarry Smith SNESMonitorRatioContext *ctx = (SNESMonitorRatioContext*)dummy; 4703a7fca6bSBarry Smith 4713a7fca6bSBarry Smith PetscFunctionBegin; 4720298fd71SBarry Smith ierr = SNESGetConvergenceHistory(snes,&history,NULL,&len);CHKERRQ(ierr); 473649052a6SBarry Smith ierr = PetscViewerASCIIAddTab(ctx->viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 474958c9bccSBarry Smith if (!its || !history || its > len) { 475649052a6SBarry Smith ierr = PetscViewerASCIIPrintf(ctx->viewer,"%3D SNES Function norm %14.12e \n",its,(double)fgnorm);CHKERRQ(ierr); 4763a7fca6bSBarry Smith } else { 47787828ca2SBarry Smith PetscReal ratio = fgnorm/history[its-1]; 4788f1a2a5eSBarry Smith ierr = PetscViewerASCIIPrintf(ctx->viewer,"%3D SNES Function norm %14.12e %14.12e \n",its,(double)fgnorm,(double)ratio);CHKERRQ(ierr); 4793a7fca6bSBarry Smith } 480649052a6SBarry Smith ierr = PetscViewerASCIISubtractTab(ctx->viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 4813a7fca6bSBarry Smith PetscFunctionReturn(0); 4823a7fca6bSBarry Smith } 4833a7fca6bSBarry Smith 4843a7fca6bSBarry Smith /* 4853a7fca6bSBarry Smith If the we set the history monitor space then we must destroy it 4863a7fca6bSBarry Smith */ 4873a7fca6bSBarry Smith #undef __FUNCT__ 488a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorRatioDestroy" 489c2efdce3SBarry Smith PetscErrorCode SNESMonitorRatioDestroy(void **ct) 4903a7fca6bSBarry Smith { 491dfbe8321SBarry Smith PetscErrorCode ierr; 492c2efdce3SBarry Smith SNESMonitorRatioContext *ctx = *(SNESMonitorRatioContext**)ct; 4933a7fca6bSBarry Smith 4943a7fca6bSBarry Smith PetscFunctionBegin; 49505b42c5fSBarry Smith ierr = PetscFree(ctx->history);CHKERRQ(ierr); 496649052a6SBarry Smith ierr = PetscViewerDestroy(&ctx->viewer);CHKERRQ(ierr); 497eabae89aSBarry Smith ierr = PetscFree(ctx);CHKERRQ(ierr); 4983a7fca6bSBarry Smith PetscFunctionReturn(0); 4993a7fca6bSBarry Smith } 5003a7fca6bSBarry Smith 5013a7fca6bSBarry Smith #undef __FUNCT__ 502a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorSetRatio" 5033a7fca6bSBarry Smith /*@C 504a6570f20SBarry Smith SNESMonitorSetRatio - Sets SNES to use a monitor that prints the 5054b27c08aSLois Curfman McInnes ratio of the function norm at each iteration. 5063a7fca6bSBarry Smith 5073a7fca6bSBarry Smith Collective on SNES 5083a7fca6bSBarry Smith 5093a7fca6bSBarry Smith Input Parameters: 510eabae89aSBarry Smith + snes - the SNES context 511eabae89aSBarry Smith - viewer - ASCII viewer to print output 5123a7fca6bSBarry Smith 5133a7fca6bSBarry Smith Level: intermediate 5143a7fca6bSBarry Smith 5153a7fca6bSBarry Smith .keywords: SNES, nonlinear, monitor, norm 5163a7fca6bSBarry Smith 517a6570f20SBarry Smith .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault() 5183a7fca6bSBarry Smith @*/ 519649052a6SBarry Smith PetscErrorCode SNESMonitorSetRatio(SNES snes,PetscViewer viewer) 5203a7fca6bSBarry Smith { 521dfbe8321SBarry Smith PetscErrorCode ierr; 522a6570f20SBarry Smith SNESMonitorRatioContext *ctx; 52387828ca2SBarry Smith PetscReal *history; 5243a7fca6bSBarry Smith 5253a7fca6bSBarry Smith PetscFunctionBegin; 526b00a9115SJed Brown ierr = PetscNewLog(snes,&ctx);CHKERRQ(ierr); 5270298fd71SBarry Smith ierr = SNESGetConvergenceHistory(snes,&history,NULL,NULL);CHKERRQ(ierr); 5283a7fca6bSBarry Smith if (!history) { 529785e854fSJed Brown ierr = PetscMalloc1(100,&ctx->history);CHKERRQ(ierr); 530eabae89aSBarry Smith ierr = SNESSetConvergenceHistory(snes,ctx->history,0,100,PETSC_TRUE);CHKERRQ(ierr); 5313a7fca6bSBarry Smith } 532eabae89aSBarry Smith ctx->viewer = viewer; 533f5af7f23SKarl Rupp 534a6570f20SBarry Smith ierr = SNESMonitorSet(snes,SNESMonitorRatio,ctx,SNESMonitorRatioDestroy);CHKERRQ(ierr); 5353a7fca6bSBarry Smith PetscFunctionReturn(0); 5363a7fca6bSBarry Smith } 5373a7fca6bSBarry Smith 538e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */ 5394a2ae208SSatish Balay #undef __FUNCT__ 540a6570f20SBarry Smith #define __FUNCT__ "SNESMonitorDefaultShort" 541be1f7002SBarry Smith /* 542a6570f20SBarry Smith Default (short) SNES Monitor, same as SNESMonitorDefault() except 543be1f7002SBarry Smith it prints fewer digits of the residual as the residual gets smaller. 544be1f7002SBarry Smith This is because the later digits are meaningless and are often 545be1f7002SBarry Smith different on different machines; by using this routine different 546be1f7002SBarry Smith machines will usually generate the same output. 547be1f7002SBarry Smith */ 5487087cfbeSBarry Smith PetscErrorCode SNESMonitorDefaultShort(SNES snes,PetscInt its,PetscReal fgnorm,void *dummy) 549e7e93795SLois Curfman McInnes { 550dfbe8321SBarry Smith PetscErrorCode ierr; 5514d4332d5SBarry Smith PetscViewer viewer = (PetscViewer) dummy; 552d132466eSBarry Smith 5533a40ed3dSBarry Smith PetscFunctionBegin; 5544d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 555649052a6SBarry Smith ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 5568f240d10SBarry Smith if (fgnorm > 1.e-9) { 5578fa295daSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %g \n",its,(double)fgnorm);CHKERRQ(ierr); 5583a40ed3dSBarry Smith } else if (fgnorm > 1.e-11) { 5598fa295daSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm %5.3e \n",its,(double)fgnorm);CHKERRQ(ierr); 5603a40ed3dSBarry Smith } else { 561649052a6SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%3D SNES Function norm < 1.e-11\n",its);CHKERRQ(ierr); 562a34d58ebSBarry Smith } 563649052a6SBarry Smith ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)snes)->tablevel);CHKERRQ(ierr); 5643a40ed3dSBarry Smith PetscFunctionReturn(0); 565e7e93795SLois Curfman McInnes } 5662db13446SMatthew G. Knepley 5672db13446SMatthew G. Knepley #undef __FUNCT__ 5682db13446SMatthew G. Knepley #define __FUNCT__ "SNESMonitorDefaultField" 5692db13446SMatthew G. Knepley /*@C 5702db13446SMatthew G. Knepley SNESMonitorDefaultField - Monitors progress of the SNES solvers, separated into fields. 5712db13446SMatthew G. Knepley 5722db13446SMatthew G. Knepley Collective on SNES 5732db13446SMatthew G. Knepley 5742db13446SMatthew G. Knepley Input Parameters: 5752db13446SMatthew G. Knepley + snes - the SNES context 5762db13446SMatthew G. Knepley . its - iteration number 5772db13446SMatthew G. Knepley . fgnorm - 2-norm of residual 5782db13446SMatthew G. Knepley - ctx - the PetscViewer 5792db13446SMatthew G. Knepley 5802db13446SMatthew G. Knepley Notes: 5812db13446SMatthew G. Knepley This routine uses the DM attached to the residual vector 5822db13446SMatthew G. Knepley 5832db13446SMatthew G. Knepley Level: intermediate 5842db13446SMatthew G. Knepley 5852db13446SMatthew G. Knepley .keywords: SNES, nonlinear, field, monitor, norm 5862db13446SMatthew G. Knepley .seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault(), SNESMonitorDefaultShort() 5872db13446SMatthew G. Knepley @*/ 5882db13446SMatthew G. Knepley PetscErrorCode SNESMonitorDefaultField(SNES snes, PetscInt its, PetscReal fgnorm, void *ctx) 5892db13446SMatthew G. Knepley { 5904d4332d5SBarry Smith PetscViewer viewer = (PetscViewer) ctx; 5912db13446SMatthew G. Knepley Vec r; 5922db13446SMatthew G. Knepley DM dm; 5932db13446SMatthew G. Knepley PetscReal res[256]; 5942db13446SMatthew G. Knepley PetscInt tablevel; 5952db13446SMatthew G. Knepley PetscErrorCode ierr; 5962db13446SMatthew G. Knepley 5972db13446SMatthew G. Knepley PetscFunctionBegin; 5984d4332d5SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); 5992db13446SMatthew G. Knepley ierr = SNESGetFunction(snes, &r, NULL, NULL);CHKERRQ(ierr); 6002db13446SMatthew G. Knepley ierr = VecGetDM(r, &dm);CHKERRQ(ierr); 6012db13446SMatthew G. Knepley if (!dm) {ierr = SNESMonitorDefault(snes, its, fgnorm, ctx);CHKERRQ(ierr);} 6022db13446SMatthew G. Knepley else { 6032db13446SMatthew G. Knepley PetscSection s, gs; 6042db13446SMatthew G. Knepley PetscInt Nf, f; 6052db13446SMatthew G. Knepley 6062db13446SMatthew G. Knepley ierr = DMGetDefaultSection(dm, &s);CHKERRQ(ierr); 6072db13446SMatthew G. Knepley ierr = DMGetDefaultGlobalSection(dm, &gs);CHKERRQ(ierr); 6082db13446SMatthew G. Knepley if (!s || !gs) {ierr = SNESMonitorDefault(snes, its, fgnorm, ctx);CHKERRQ(ierr);} 6092db13446SMatthew G. Knepley ierr = PetscSectionGetNumFields(s, &Nf);CHKERRQ(ierr); 6102db13446SMatthew G. Knepley if (Nf > 256) SETERRQ1(PetscObjectComm((PetscObject) snes), PETSC_ERR_SUP, "Do not support %d fields > 256", Nf); 6112db13446SMatthew G. Knepley ierr = PetscSectionVecNorm(s, gs, r, NORM_2, res);CHKERRQ(ierr); 6122db13446SMatthew G. Knepley ierr = PetscObjectGetTabLevel((PetscObject) snes, &tablevel);CHKERRQ(ierr); 6132db13446SMatthew G. Knepley ierr = PetscViewerASCIIAddTab(viewer, tablevel);CHKERRQ(ierr); 6142db13446SMatthew G. Knepley ierr = PetscViewerASCIIPrintf(viewer, "%3D SNES Function norm %14.12e [", its, (double) fgnorm);CHKERRQ(ierr); 6152db13446SMatthew G. Knepley for (f = 0; f < Nf; ++f) { 6162db13446SMatthew G. Knepley if (f) {ierr = PetscViewerASCIIPrintf(viewer, ", ");CHKERRQ(ierr);} 6172db13446SMatthew G. Knepley ierr = PetscViewerASCIIPrintf(viewer, "%14.12e", res[f]);CHKERRQ(ierr); 6182db13446SMatthew G. Knepley } 6192db13446SMatthew G. Knepley ierr = PetscViewerASCIIPrintf(viewer, "] \n");CHKERRQ(ierr); 6202db13446SMatthew G. Knepley ierr = PetscViewerASCIISubtractTab(viewer, tablevel);CHKERRQ(ierr); 6212db13446SMatthew G. Knepley } 6222db13446SMatthew G. Knepley PetscFunctionReturn(0); 6232db13446SMatthew G. Knepley } 624e7e93795SLois Curfman McInnes /* ---------------------------------------------------------------- */ 6254a2ae208SSatish Balay #undef __FUNCT__ 6268d359177SBarry Smith #define __FUNCT__ "SNESConvergedDefault" 6274b828684SBarry Smith /*@C 6288d359177SBarry Smith SNESConvergedDefault - Convergence test of the solvers for 629f525115eSLois Curfman McInnes systems of nonlinear equations (default). 630e7e93795SLois Curfman McInnes 631c7afd0dbSLois Curfman McInnes Collective on SNES 632c7afd0dbSLois Curfman McInnes 633e7e93795SLois Curfman McInnes Input Parameters: 634c7afd0dbSLois Curfman McInnes + snes - the SNES context 63506ee9f85SBarry Smith . it - the iteration (0 indicates before any Newton steps) 636e7e93795SLois Curfman McInnes . xnorm - 2-norm of current iterate 637c60f73f4SPeter Brune . snorm - 2-norm of current step 6387f3332b4SBarry Smith . fnorm - 2-norm of function at current iterate 639c7afd0dbSLois Curfman McInnes - dummy - unused context 640e7e93795SLois Curfman McInnes 641184914b5SBarry Smith Output Parameter: 642184914b5SBarry Smith . reason - one of 64370441072SBarry Smith $ SNES_CONVERGED_FNORM_ABS - (fnorm < abstol), 644c60f73f4SPeter Brune $ SNES_CONVERGED_SNORM_RELATIVE - (snorm < stol*xnorm), 645184914b5SBarry Smith $ SNES_CONVERGED_FNORM_RELATIVE - (fnorm < rtol*fnorm0), 646184914b5SBarry Smith $ SNES_DIVERGED_FUNCTION_COUNT - (nfct > maxf), 647184914b5SBarry Smith $ SNES_DIVERGED_FNORM_NAN - (fnorm == NaN), 648184914b5SBarry Smith $ SNES_CONVERGED_ITERATING - (otherwise), 649e7e93795SLois Curfman McInnes 650e7e93795SLois Curfman McInnes where 651c7afd0dbSLois Curfman McInnes + maxf - maximum number of function evaluations, 652c7afd0dbSLois Curfman McInnes set with SNESSetTolerances() 653c7afd0dbSLois Curfman McInnes . nfct - number of function evaluations, 65470441072SBarry Smith . abstol - absolute function norm tolerance, 655c7afd0dbSLois Curfman McInnes set with SNESSetTolerances() 656c7afd0dbSLois Curfman McInnes - rtol - relative function norm tolerance, set with SNESSetTolerances() 657fee21e36SBarry Smith 65836851e7fSLois Curfman McInnes Level: intermediate 65936851e7fSLois Curfman McInnes 660e7e93795SLois Curfman McInnes .keywords: SNES, nonlinear, default, converged, convergence 661e7e93795SLois Curfman McInnes 66271f87433Sdalcinl .seealso: SNESSetConvergenceTest() 663e7e93795SLois Curfman McInnes @*/ 6648d359177SBarry Smith PetscErrorCode SNESConvergedDefault(SNES snes,PetscInt it,PetscReal xnorm,PetscReal snorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy) 665e7e93795SLois Curfman McInnes { 66663ba0a88SBarry Smith PetscErrorCode ierr; 66763ba0a88SBarry Smith 6683a40ed3dSBarry Smith PetscFunctionBegin; 6690700a824SBarry Smith PetscValidHeaderSpecific(snes,SNES_CLASSID,1); 6703f149594SLisandro Dalcin PetscValidPointer(reason,6); 6713f149594SLisandro Dalcin 67206ee9f85SBarry Smith *reason = SNES_CONVERGED_ITERATING; 67306ee9f85SBarry Smith 67406ee9f85SBarry Smith if (!it) { 67506ee9f85SBarry Smith /* set parameter for default relative tolerance convergence test */ 67606ee9f85SBarry Smith snes->ttol = fnorm*snes->rtol; 67706ee9f85SBarry Smith } 6788146f6ebSBarry Smith if (PetscIsInfOrNanReal(fnorm)) { 679ae15b995SBarry Smith ierr = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr); 680184914b5SBarry Smith *reason = SNES_DIVERGED_FNORM_NAN; 68170441072SBarry Smith } else if (fnorm < snes->abstol) { 6828f1a2a5eSBarry Smith ierr = PetscInfo2(snes,"Converged due to function norm %14.12e < %14.12e\n",(double)fnorm,(double)snes->abstol);CHKERRQ(ierr); 683184914b5SBarry Smith *reason = SNES_CONVERGED_FNORM_ABS; 68443e71028SBarry Smith } else if (snes->nfuncs >= snes->max_funcs) { 685ae15b995SBarry Smith ierr = PetscInfo2(snes,"Exceeded maximum number of function evaluations: %D > %D\n",snes->nfuncs,snes->max_funcs);CHKERRQ(ierr); 686184914b5SBarry Smith *reason = SNES_DIVERGED_FUNCTION_COUNT; 68706ee9f85SBarry Smith } 68806ee9f85SBarry Smith 68906ee9f85SBarry Smith if (it && !*reason) { 69006ee9f85SBarry Smith if (fnorm <= snes->ttol) { 6918f1a2a5eSBarry Smith ierr = PetscInfo2(snes,"Converged due to function norm %14.12e < %14.12e (relative tolerance)\n",(double)fnorm,(double)snes->ttol);CHKERRQ(ierr); 69206ee9f85SBarry Smith *reason = SNES_CONVERGED_FNORM_RELATIVE; 693c60f73f4SPeter Brune } else if (snorm < snes->stol*xnorm) { 694c60f73f4SPeter 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); 695c60f73f4SPeter Brune *reason = SNES_CONVERGED_SNORM_RELATIVE; 69606ee9f85SBarry Smith } 697e7e93795SLois Curfman McInnes } 6983a40ed3dSBarry Smith PetscFunctionReturn(0); 699e7e93795SLois Curfman McInnes } 7003f149594SLisandro Dalcin 7013f149594SLisandro Dalcin #undef __FUNCT__ 702e2a6519dSDmitry Karpeev #define __FUNCT__ "SNESConvergedSkip" 7033f149594SLisandro Dalcin /*@C 704e2a6519dSDmitry Karpeev SNESConvergedSkip - Convergence test for SNES that NEVER returns as 7053f149594SLisandro Dalcin converged, UNLESS the maximum number of iteration have been reached. 7063f149594SLisandro Dalcin 7073f9fe445SBarry Smith Logically Collective on SNES 7083f149594SLisandro Dalcin 7093f149594SLisandro Dalcin Input Parameters: 7103f149594SLisandro Dalcin + snes - the SNES context 7113f149594SLisandro Dalcin . it - the iteration (0 indicates before any Newton steps) 7123f149594SLisandro Dalcin . xnorm - 2-norm of current iterate 713c60f73f4SPeter Brune . snorm - 2-norm of current step 7143f149594SLisandro Dalcin . fnorm - 2-norm of function at current iterate 7153f149594SLisandro Dalcin - dummy - unused context 7163f149594SLisandro Dalcin 7173f149594SLisandro Dalcin Output Parameter: 71885385478SLisandro Dalcin . reason - SNES_CONVERGED_ITERATING, SNES_CONVERGED_ITS, or SNES_DIVERGED_FNORM_NAN 7193f149594SLisandro Dalcin 7203f149594SLisandro Dalcin Notes: 7213f149594SLisandro Dalcin Convergence is then declared after a fixed number of iterations have been used. 7223f149594SLisandro Dalcin 7233f149594SLisandro Dalcin Level: advanced 7243f149594SLisandro Dalcin 7253f149594SLisandro Dalcin .keywords: SNES, nonlinear, skip, converged, convergence 7263f149594SLisandro Dalcin 7273f149594SLisandro Dalcin .seealso: SNESSetConvergenceTest() 7283f149594SLisandro Dalcin @*/ 729e2a6519dSDmitry Karpeev PetscErrorCode SNESConvergedSkip(SNES snes,PetscInt it,PetscReal xnorm,PetscReal snorm,PetscReal fnorm,SNESConvergedReason *reason,void *dummy) 7303f149594SLisandro Dalcin { 7313f149594SLisandro Dalcin PetscErrorCode ierr; 7323f149594SLisandro Dalcin 7333f149594SLisandro Dalcin PetscFunctionBegin; 7340700a824SBarry Smith PetscValidHeaderSpecific(snes,SNES_CLASSID,1); 7353f149594SLisandro Dalcin PetscValidPointer(reason,6); 7363f149594SLisandro Dalcin 7373f149594SLisandro Dalcin *reason = SNES_CONVERGED_ITERATING; 7383f149594SLisandro Dalcin 7393f149594SLisandro Dalcin if (fnorm != fnorm) { 7403f149594SLisandro Dalcin ierr = PetscInfo(snes,"Failed to converged, function norm is NaN\n");CHKERRQ(ierr); 7413f149594SLisandro Dalcin *reason = SNES_DIVERGED_FNORM_NAN; 7423f149594SLisandro Dalcin } else if (it == snes->max_its) { 7433f149594SLisandro Dalcin *reason = SNES_CONVERGED_ITS; 7443f149594SLisandro Dalcin } 7453f149594SLisandro Dalcin PetscFunctionReturn(0); 7463f149594SLisandro Dalcin } 7473f149594SLisandro Dalcin 74858c9b817SLisandro Dalcin #undef __FUNCT__ 749fa0ddf94SBarry Smith #define __FUNCT__ "SNESSetWorkVecs" 7508d359177SBarry Smith /*@C 751fa0ddf94SBarry Smith SNESSetWorkVecs - Gets a number of work vectors. 75258c9b817SLisandro Dalcin 75358c9b817SLisandro Dalcin Input Parameters: 75458c9b817SLisandro Dalcin . snes - the SNES context 75558c9b817SLisandro Dalcin . nw - number of work vectors to allocate 75658c9b817SLisandro Dalcin 75758c9b817SLisandro Dalcin Level: developer 75858c9b817SLisandro Dalcin 759fa0ddf94SBarry Smith Developers Note: This is PETSC_EXTERN because it may be used by user written plugin SNES implementations 760fa0ddf94SBarry Smith 76198acb6afSMatthew G Knepley @*/ 762fa0ddf94SBarry Smith PetscErrorCode SNESSetWorkVecs(SNES snes,PetscInt nw) 76358c9b817SLisandro Dalcin { 764c5ed8070SMatthew G. Knepley DM dm; 765c5ed8070SMatthew G. Knepley Vec v; 76658c9b817SLisandro Dalcin PetscErrorCode ierr; 76758c9b817SLisandro Dalcin 76858c9b817SLisandro Dalcin PetscFunctionBegin; 76958c9b817SLisandro Dalcin if (snes->work) {ierr = VecDestroyVecs(snes->nwork,&snes->work);CHKERRQ(ierr);} 77058c9b817SLisandro Dalcin snes->nwork = nw; 771f5af7f23SKarl Rupp 772c5ed8070SMatthew G. Knepley ierr = SNESGetDM(snes, &dm);CHKERRQ(ierr); 773c5ed8070SMatthew G. Knepley ierr = DMGetGlobalVector(dm, &v);CHKERRQ(ierr); 774c5ed8070SMatthew G. Knepley ierr = VecDuplicateVecs(v,snes->nwork,&snes->work);CHKERRQ(ierr); 775c5ed8070SMatthew G. Knepley ierr = DMRestoreGlobalVector(dm, &v);CHKERRQ(ierr); 77658c9b817SLisandro Dalcin ierr = PetscLogObjectParents(snes,nw,snes->work);CHKERRQ(ierr); 77758c9b817SLisandro Dalcin PetscFunctionReturn(0); 77858c9b817SLisandro Dalcin } 779