Actual source code: kspsaws.c

  1: #include <petsc/private/kspimpl.h>
  2: #include <petscviewersaws.h>

  4: typedef struct {
  5:   PetscViewer viewer;
  6:   PetscInt    neigs;
  7:   PetscReal  *eigi;
  8:   PetscReal  *eigr;
  9: } KSPMonitor_SAWs;

 11: /*@C
 12:    KSPMonitorSAWsCreate - create an SAWs monitor context for `KSP`

 14:    Collective

 16:    Input Parameter:
 17: .  ksp - `KSP` to monitor

 19:    Output Parameter:
 20: .  ctx - context for monitor

 22:    Level: developer

 24: .seealso: [](chapter_ksp), `KSP`, `KSPMonitorSet()`, `KSPMonitorSAWs()`, `KSPMonitorSAWsDestroy()`
 25: @*/
 26: PetscErrorCode KSPMonitorSAWsCreate(KSP ksp, void **ctx)
 27: {
 28:   KSPMonitor_SAWs *mon;

 30:   PetscNew(&mon);
 31:   mon->viewer = PETSC_VIEWER_SAWS_(PetscObjectComm((PetscObject)ksp));
 33:   *ctx = (void *)mon;
 34:   return 0;
 35: }

 37: /*@C
 38:    KSPMonitorSAWsDestroy - destroy a monitor context created with `KSPMonitorSAWsCreate()`

 40:    Collective

 42:    Input Parameter:
 43: .  ctx - monitor context

 45:    Level: developer

 47: .seealso: [](chapter_ksp), `KSP`, `KSPMonitorSet()`, `KSPMonitorSAWsCreate()`
 48: @*/
 49: PetscErrorCode KSPMonitorSAWsDestroy(void **ctx)
 50: {
 51:   KSPMonitor_SAWs *mon = (KSPMonitor_SAWs *)*ctx;

 53:   PetscFree2(mon->eigr, mon->eigi);
 54:   PetscFree(*ctx);
 55:   return 0;
 56: }

 58: /*@C
 59:    KSPMonitorSAWs - monitor `KSP` solution using SAWs

 61:    Logically Collective

 63:    Input Parameters:
 64: +  ksp   - iterative context
 65: .  n     - iteration number
 66: .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
 67: -  ctx -  created with `KSPMonitorSAWsCreate()`

 69:    Level: advanced

 71:    Note:
 72:    Create the ctx with `KSPMonitorSAWsCreate()` then call `KSPMonitorSet()` with the context, this function, and `KSPMonitorSAWsDestroy()`

 74: .seealso: [](chapter_ksp), `KSP`, `KSPMonitorSet()`, `KSPMonitorSAWsCreate()`, `KSPMonitorSAWsDestroy()`, `KSPMonitorSingularValue()`, `KSPComputeExtremeSingularValues()`, `PetscViewerSAWsOpen()`
 75: @*/
 76: PetscErrorCode KSPMonitorSAWs(KSP ksp, PetscInt n, PetscReal rnorm, void *ctx)
 77: {
 78:   KSPMonitor_SAWs *mon = (KSPMonitor_SAWs *)ctx;
 79:   PetscReal        emax, emin;
 80:   PetscMPIInt      rank;

 83:   KSPComputeExtremeSingularValues(ksp, &emax, &emin);

 85:   PetscFree2(mon->eigr, mon->eigi);
 86:   PetscMalloc2(n, &mon->eigr, n, &mon->eigi);
 87:   if (n) {
 88:     KSPComputeEigenvalues(ksp, n, mon->eigr, mon->eigi, &mon->neigs);

 90:     MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
 91:     if (rank == 0) {
 92:       SAWs_Delete("/PETSc/ksp_monitor_saws/eigr");
 93:       SAWs_Delete("/PETSc/ksp_monitor_saws/eigi");

 95:       SAWs_Register, ("/PETSc/ksp_monitor_saws/rnorm", &ksp->rnorm, 1, SAWs_READ, SAWs_DOUBLE);
 96:       SAWs_Register, ("/PETSc/ksp_monitor_saws/neigs", &mon->neigs, 1, SAWs_READ, SAWs_INT);
 97:       if (mon->neigs > 0) {
 98:         SAWs_Register, ("/PETSc/ksp_monitor_saws/eigr", mon->eigr, mon->neigs, SAWs_READ, SAWs_DOUBLE);
 99:         SAWs_Register, ("/PETSc/ksp_monitor_saws/eigi", mon->eigi, mon->neigs, SAWs_READ, SAWs_DOUBLE);
100:       }
101:       PetscInfo(ksp, "KSP extreme singular values min=%g max=%g\n", (double)emin, (double)emax);
102:       PetscSAWsBlock();
103:     }
104:   }
105:   return 0;
106: }