xref: /petsc/src/ksp/ksp/interface/xmon.c (revision 9ef679b9b397ea7f8b0ffa0e16e2dbe668d3f68d)
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