1 2 #include <petsc/private/kspimpl.h> /*I "petscksp.h" I*/ 3 #include <petscdraw.h> 4 5 PetscErrorCode KSPMonitorLGCreate(MPI_Comm comm,const char host[],const char label[],const char metric[],PetscInt l,const char *names[],int x,int y,int m,int n,PetscDrawLG *lgctx) 6 { 7 PetscDraw draw; 8 PetscDrawAxis axis; 9 PetscDrawLG lg; 10 PetscErrorCode ierr; 11 12 PetscFunctionBegin; 13 ierr = PetscDrawCreate(comm,host,label,x,y,m,n,&draw);CHKERRQ(ierr); 14 ierr = PetscDrawSetFromOptions(draw);CHKERRQ(ierr); 15 ierr = PetscDrawLGCreate(draw,l,&lg);CHKERRQ(ierr); 16 if (names) {ierr = PetscDrawLGSetLegend(lg,names);CHKERRQ(ierr);} 17 ierr = PetscDrawLGSetFromOptions(lg);CHKERRQ(ierr); 18 ierr = PetscDrawLGGetAxis(lg,&axis);CHKERRQ(ierr); 19 ierr = PetscDrawAxisSetLabels(axis,"Convergence","Iteration",metric);CHKERRQ(ierr); 20 ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr); 21 *lgctx = lg; 22 PetscFunctionReturn(0); 23 } 24 25 PetscErrorCode KSPMonitorLGRange(KSP ksp,PetscInt n,PetscReal rnorm,void *monctx) 26 { 27 PetscDrawLG lg; 28 PetscErrorCode ierr; 29 PetscReal x,y,per; 30 PetscViewer v = (PetscViewer)monctx; 31 static PetscReal prev; /* should be in the context */ 32 PetscDraw draw; 33 34 PetscFunctionBegin; 35 PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,4); 36 37 ierr = KSPMonitorRange_Private(ksp,n,&per);CHKERRQ(ierr); 38 if (!n) prev = rnorm; 39 40 ierr = PetscViewerDrawGetDrawLG(v,0,&lg);CHKERRQ(ierr); 41 if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);} 42 ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr); 43 ierr = PetscDrawSetTitle(draw,"Residual norm");CHKERRQ(ierr); 44 x = (PetscReal) n; 45 if (rnorm > 0.0) y = PetscLog10Real(rnorm); 46 else y = -15.0; 47 ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr); 48 if (n < 20 || !(n % 5) || ksp->reason) { 49 ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr); 50 ierr = PetscDrawLGSave(lg);CHKERRQ(ierr); 51 } 52 53 ierr = PetscViewerDrawGetDrawLG(v,1,&lg);CHKERRQ(ierr); 54 if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);} 55 ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr); 56 ierr = PetscDrawSetTitle(draw,"% elemts > .2*max elemt");CHKERRQ(ierr); 57 x = (PetscReal) n; 58 y = 100.0*per; 59 ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr); 60 if (n < 20 || !(n % 5) || ksp->reason) { 61 ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr); 62 ierr = PetscDrawLGSave(lg);CHKERRQ(ierr); 63 } 64 65 ierr = PetscViewerDrawGetDrawLG(v,2,&lg);CHKERRQ(ierr); 66 if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);} 67 ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr); 68 ierr = PetscDrawSetTitle(draw,"(norm-oldnorm)/oldnorm");CHKERRQ(ierr); 69 x = (PetscReal) n; 70 y = (prev - rnorm)/prev; 71 ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr); 72 if (n < 20 || !(n % 5) || ksp->reason) { 73 ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr); 74 ierr = PetscDrawLGSave(lg);CHKERRQ(ierr); 75 } 76 77 ierr = PetscViewerDrawGetDrawLG(v,3,&lg);CHKERRQ(ierr); 78 if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);} 79 ierr = PetscDrawLGGetDraw(lg,&draw);CHKERRQ(ierr); 80 ierr = PetscDrawSetTitle(draw,"(norm -oldnorm)/oldnorm*(% > .2 max)");CHKERRQ(ierr); 81 x = (PetscReal) n; 82 y = (prev - rnorm)/(prev*per); 83 if (n > 5) { 84 ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr); 85 } 86 if (n < 20 || !(n % 5) || ksp->reason) { 87 ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr); 88 ierr = PetscDrawLGSave(lg);CHKERRQ(ierr); 89 } 90 91 prev = rnorm; 92 PetscFunctionReturn(0); 93 } 94