Actual source code: xmon.c


  2: #include <petsc/private/kspimpl.h>
  3: #include <petscdraw.h>

  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;

 11:   PetscDrawCreate(comm, host, label, x, y, m, n, &draw);
 12:   PetscDrawSetFromOptions(draw);
 13:   PetscDrawLGCreate(draw, l, &lg);
 14:   if (names) PetscDrawLGSetLegend(lg, names);
 15:   PetscDrawLGSetFromOptions(lg);
 16:   PetscDrawLGGetAxis(lg, &axis);
 17:   PetscDrawAxisSetLabels(axis, "Convergence", "Iteration", metric);
 18:   PetscDrawDestroy(&draw);
 19:   *lgctx = lg;
 20:   return 0;
 21: }

 23: PetscErrorCode KSPMonitorLGRange(KSP ksp, PetscInt n, PetscReal rnorm, void *monctx)
 24: {
 25:   PetscDrawLG      lg;
 26:   PetscReal        x, y, per;
 27:   PetscViewer      v = (PetscViewer)monctx;
 28:   static PetscReal prev; /* should be in the context */
 29:   PetscDraw        draw;


 33:   KSPMonitorRange_Private(ksp, n, &per);
 34:   if (!n) prev = rnorm;

 36:   PetscViewerDrawGetDrawLG(v, 0, &lg);
 37:   if (!n) PetscDrawLGReset(lg);
 38:   PetscDrawLGGetDraw(lg, &draw);
 39:   PetscDrawSetTitle(draw, "Residual norm");
 40:   x = (PetscReal)n;
 41:   if (rnorm > 0.0) y = PetscLog10Real(rnorm);
 42:   else y = -15.0;
 43:   PetscDrawLGAddPoint(lg, &x, &y);
 44:   if (n < 20 || !(n % 5) || ksp->reason) {
 45:     PetscDrawLGDraw(lg);
 46:     PetscDrawLGSave(lg);
 47:   }

 49:   PetscViewerDrawGetDrawLG(v, 1, &lg);
 50:   if (!n) PetscDrawLGReset(lg);
 51:   PetscDrawLGGetDraw(lg, &draw);
 52:   PetscDrawSetTitle(draw, "% elemts > .2*max elemt");
 53:   x = (PetscReal)n;
 54:   y = 100.0 * per;
 55:   PetscDrawLGAddPoint(lg, &x, &y);
 56:   if (n < 20 || !(n % 5) || ksp->reason) {
 57:     PetscDrawLGDraw(lg);
 58:     PetscDrawLGSave(lg);
 59:   }

 61:   PetscViewerDrawGetDrawLG(v, 2, &lg);
 62:   if (!n) PetscDrawLGReset(lg);
 63:   PetscDrawLGGetDraw(lg, &draw);
 64:   PetscDrawSetTitle(draw, "(norm-oldnorm)/oldnorm");
 65:   x = (PetscReal)n;
 66:   y = (prev - rnorm) / prev;
 67:   PetscDrawLGAddPoint(lg, &x, &y);
 68:   if (n < 20 || !(n % 5) || ksp->reason) {
 69:     PetscDrawLGDraw(lg);
 70:     PetscDrawLGSave(lg);
 71:   }

 73:   PetscViewerDrawGetDrawLG(v, 3, &lg);
 74:   if (!n) PetscDrawLGReset(lg);
 75:   PetscDrawLGGetDraw(lg, &draw);
 76:   PetscDrawSetTitle(draw, "(norm -oldnorm)/oldnorm*(% > .2 max)");
 77:   x = (PetscReal)n;
 78:   y = (prev - rnorm) / (prev * per);
 79:   if (n > 5) PetscDrawLGAddPoint(lg, &x, &y);
 80:   if (n < 20 || !(n % 5) || ksp->reason) {
 81:     PetscDrawLGDraw(lg);
 82:     PetscDrawLGSave(lg);
 83:   }

 85:   prev = rnorm;
 86:   return 0;
 87: }